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

35

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

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

daphshez
источник

Ответы:

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 функции для запуска выше: в противном случае, вы можете создать простой пользовательский модуль.

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

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

rfay
источник
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 ().

Mirsoft
источник
4

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

хаа
источник
2

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

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

обращаться

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

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

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

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

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

DRUPWAY
источник