Массовое обновление поля?


35

Я добавил новое (текстовое) поле в тип контента Drupal 7, который уже имеет много узлов.

Как заполнить поле значением по умолчанию для всех этих узлов?

Ответы:


37

Вы можете использовать EntityFieldQueryдля получения списка узлов, а затем обновить поля узла с помощью 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);
  }
}

Если это разовые операций, вы можете использовать Devel модуль Выполнение PHP функции для запуска выше: в противном случае, вы можете создать простой пользовательский модуль.


2
Помимо использования devel или vbo, вы также можете использовать «drush scr myscript.php» для выполнения вышеуказанного кода в полностью загруженной среде.
fietserwin

Как этот код изменяется, чтобы приспособить выполнение той же операции к полю ссылки на термин?
Screenack

17

Я бы использовал Views Bulk Operations и использовал бы «Выполнить произвольный PHP-скрипт», чтобы выполнить, по существу, перечисленные выше пункты, но вам не нужно делать весь дополнительный код, только маленький фрагмент, который делает то, что вы хотите (например $object->field_foo['und'][0]['value'] = 'some_value')


9

Если вы хотите обновить только поле с некоторым значением, то более производительная альтернатива принятому ответу такова:

$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);
  }
}

Разница заключается в использовании напрямую field_attach_presaveи field_attach_updateфункций, которые корректно обновляют только поле узла и пропускают оставшуюся часть процесса сохранения узла. Это оказывает влияние на то, что никакие перехваты предварительного сохранения / сохранения узла не будут вызываться, «измененная» дата не будет обновлена ​​до текущей даты и т. Д. В соответствии с вашим вариантом использования может быть лучше использовать весь процесс node_save ().


4

Действительно, VBO (Views Bulk Operations) является хорошим решением. Кроме того, в последних версиях вы найдете опцию «Изменить значения сущностей», которая обеспечивает очень простой способ обновления языка узлов за одну операцию.


2

Установите и включите модуль Views Bulk Operations и создайте представление с отображением страницы.

Добавить => Массовые операции: поле Content (Content) в поле зрения.

обращаться

введите описание изображения здесь

Выберите поля, которые вы хотите установить значение по умолчанию.

В вашем случае это название. На изображении это теги.

Сохраните вид и перейдите на созданную им страницу. Если у вас есть более одной страницы результатов, вы можете выбрать все элементы на текущей странице, все элементы на всех страницах или установить флажки вручную, соответствующие отдельным узлам. Для продолжения необходимо установить хотя бы один флажок.

Теперь вы устанавливаете значение по умолчанию и сохраняете его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.