it-swarm-vi.com

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

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 từng 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ó?

15
DanH

Đá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 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!).

10
geerlingguy

Đặ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?

2
Mike

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
Matoeil

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 bằng 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

enter image description here

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ể kiểm tra thủ công các hộp 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
DRUPWAY

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ử nghiệm nó trên D7 và nó hoạt động.

enter image description here

0
Sébastien Gicquel