Cập nhật trường số lượng lớn?


35

Tôi đã thêm một trường (văn bản) mới vào loại nội dung Drupal 7 đã có nhiều nút.

Làm cách nào tôi có thể điền vào trường với một giá trị mặc định cho tất cả các nút này?

Câu trả lời:


37

Bạn có thể sử dụng EntityFieldQueryđể truy xuất danh sách các nút, sau đó cập nhật các trường của nút với node_save():

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

Nếu đây là hoạt động một lần, bạn có thể sử dụng chức năng Thực thi PHP của mô-đun Devel để chạy ở trên: nếu không, bạn có thể tạo mô-đun tùy chỉnh đơn giản.


2
Bên cạnh việc sử dụng devel hoặc vbo, bạn cũng có thể sử dụng "drush Scr myscript.php" để thực thi mã trên trong một môi trường được khởi động đầy đủ.
fietserwin 10/03/2015

Làm thế nào để mã này thay đổi để phù hợp với việc thực hiện cùng một hoạt động cho một trường tham chiếu hạn?
Màn hình

17

Tôi sẽ sử dụng Lượt xem Hoạt động hàng loạt và sử dụng "Tập lệnh PHP tùy ý thực thi" để thực hiện các mục cơ bản ở trên, nhưng bạn không phải thực hiện tất cả các mã bổ sung, chỉ là đoạn trích nhỏ thực hiện những gì bạn muốn (như $object->field_foo['und'][0]['value'] = 'some_value')


9

Nếu bạn chỉ muốn cập nhật trường với một số giá trị, thì thay thế hiệu quả hơn cho câu trả lời được chấp nhận là:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

Sự khác biệt là trong việc sử dụng trực tiếp field_attach_presavevà các field_attach_updatehàm, chỉ cập nhật chính xác trường nút và bỏ qua phần còn lại của quá trình lưu nút. Điều này có tác động rằng sẽ không có nút cài đặt trước / lưu nút nào được gọi, ngày "đã thay đổi" sẽ không được cập nhật thành ngày hiện tại, v.v ... Theo trường hợp sử dụng của bạn, có thể tốt hơn khi sử dụng toàn bộ quá trình node_save ().


4

Thật vậy, VBO (Lượt xem hoạt động hàng loạt) là một giải pháp tốt. Hơn nữa, với các phiên bản mới nhất, bạn sẽ tìm thấy tùy chọn "Sửa đổi giá trị thực thể" cung cấp một cách rất dễ dàng để cập nhật ngôn ngữ nút trong một thao tác.


2

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.

Trong trường hợp của bạn tiêu đề của nó. Trong ảnh là thẻ.

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ó.

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.