Cập nhật tất cả các nút với trường mặc định sau khi thêm trường mới vào loại nội dung


15

Tôi có một loại nội dung hiện có với một số nút. Tôi vừa thêm một trường boolean mới với giá trị mặc định là "tắt".

Tuy nhiên, cho đến khi tôi lưu lại mỗi nút, giá trị mặc định không được đặt, do đó, chế độ xem chỉ hiển thị các nút có trường mới đang sử dụng giá trị mặc định hiện đang trống.

Làm cách nào tôi có thể cập nhật các nút hiện có, được tạo trước khi trường được thêm vào, để đặt trường đó thành giá trị mặc định của nó?


Tôi giải quyết vấn đề này bằng cách sử xem hàng loạt các hoạt động và Quy định như đã nêu trong video tuyệt vời này: commerceguys.com/resources/articles/217
Danh

Lưu lại mô-đun nút có thể giúp bạn buộc các nút cập nhật.
Supriya Rajgopal

Câu trả lời:


9

Đáng buồn thay, không có cách nào rất đơn giản để làm điều này (ngoài VBO / quy tắc), nhưng đây là mã tôi sử dụng trong các chức năng cập nhật trong các tệp cài đặt mô-đun tùy chỉnh của mình khi tôi cần chuẩn bị trước các giá trị trường cho một loại nút nhất định sau khi thêm trường mới ( trong trường hợp này, các nút 'trang'):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

Một phương thức thủ công khác được đề cập trong câu trả lời này sử dụng EntityFieldQuery và tải / lưu từng nút. Nhiều Drupal-y hơn, nhưng cách ít hiệu suất hơn ... (yêu cầu tải toàn bộ nút và lưu hoạt động cho từng nút!).


Điều đó thật đáng buồn
AlxVallejo

Bạn đã thấy mô-đun Mặc định trường? dgo.to/field_defaults
rừng

Đó là một lỗi khi chạy mã như thế này mà không xóa tất cả các nút bị ảnh hưởng từ bộ đệm tải thực thể: entity_get_controller('node')->resetCache($nids);- nếu không, sau đó node_load()có thể tải dữ liệu cũ từ bộ đệm và bất kỳ node_save()đối tượng nào sẽ ghi dữ liệu cũ đó trở lại cơ sở dữ liệu.
phils

2

Đặt cược tốt nhất là trực tiếp trong MySQl. Các bảng sẽ trông như sau:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Nếu bạn nhìn vào chúng, điều đó khá đơn giản - bạn có cần tôi bắt đầu với bạn về việc truy vấn sẽ như thế nào hoặc bạn có ổn từ đây không?


Cảm ơn Mike, không có vấn đề gì tôi có thể xử lý SQL thực sự. Tôi chỉ cảm thấy nên có một tùy chọn 'lưu lại' hoặc một cái gì đó được cung cấp dưới dạng hoạt động hàng loạt, tôi nghĩ rằng tôi có thể xem xét tích hợp VBO và Rules cho điều này trên thực tế.
DanH

Hiểu. Tôi đang ở một vị trí tương tự, tôi đang chuyển khoảng 30.000 bài viết từ một CMS khác sang Drupal. Tôi đã không thấy điểm cần thêm một mô-đun khác khi SQL nhanh và bẩn. Có lẽ bạn cũng có thể viết một hàm nhanh sẽ gọi node_load () cho tất cả các nút của bạn, điều đó cũng có thể hoạt động.
Mike

0

Chỉ cần thử logic dưới đây. nó nhanh hơn nhiều và nó cũng vượt qua tất cả các triển khai hook. biết thêm chi tiết . bạn có thể viết một truy vấn db_select trực tiếp đơn giản để lấy tất cả các nid và lặp nó với mã mẫu này.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

0

sử dụng sql, xem xét rằng các nút có giá trị trường không được đặt là

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document là bảng tương ứng với trường của tôi và chứa một giá trị mệnh giá mục nhập được đặt với id thực thể tham chiếu nút

tôi đã sử dụng SQL insert ... chọn cú pháp

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

0

Cài đặt và kích hoạt mô-đun Lượt xem Hoạt động hàng loạt và tạo chế độ xem với màn hình trang.

Thêm => Hoạt động hàng loạt: Trường nội dung (Nội dung) trong chế độ xem.

Tham khảo

nhập mô tả hình ảnh ở đây

Chọn các trường bạn muốn đặt giá trị mặc định.

Lưu chế độ xem và đi đến trang mà nó đã tạo. Nếu bạn có nhiều trang kết quả, bạn có thể chọn chọn tất cả các mục trên trang hiện tại, tất cả các mục trên tất cả các trang hoặc bạn có thể tự chọn hộp kiểm tương ứng với các nút riêng lẻ. Ít nhất một hộp kiểm tra phải được kiểm tra để tiến hành.

Bây giờ bạn đặt giá trị mặc định và lưu nó.


0

Tôi tìm thấy một cách dễ dàng để cập nhật (các) trường trong loại nội dung với mô-đun này: Mặc định trường

Xem ảnh chụp màn hình. Bạn có thể cập nhật nội dung hiện có với (các) giá trị mặc định hoặc giữ các giá trị hiện có.

Tôi đã thử nó trên D7 và nó hoạt động.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.