Об'ємне оновлення поля?


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

Якщо це разова операція, ви можете використовувати функцію Execute PHP модуля Devel , щоб виконати вищезазначене: інакше можна створити простий спеціальний модуль.


2
Крім використання devel або vbo, ви також можете використовувати "drush scr myscript.php" для виконання вищевказаного коду у повністю завантаженому середовищі.
fietserwin

Як цей код змінюється, щоб пристосувати виконання тієї ж операції до посилання терміна?
Screenack

17

Я використовував би масові операції Views і використовував "Виконати довільний скрипт 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функцій, які правильно оновлюють лише поле вузла та пропускають решту процесу збереження вузла. Це може вплинути на те, що жодні гачки попереднього збереження / збереження вузла не будуть викликані, "змінена" дата не буде оновлена ​​до поточної дати тощо.


4

Дійсно, VBO (Перегляд масових операцій) - хороше рішення. Крім того, з останніми версіями ви знайдете опцію "Змінити значення об'єктів", яка забезпечує дуже простий спосіб оновити мову вузлів за одну операцію.


2

Встановіть та увімкніть модуль « Масові операції перегляду» та створіть перегляд із відображенням сторінки.

Додати => Масові операції: поле перегляду вмісту (вмісту).

Зверніться

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

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

У вашому випадку його назва. На зображенні це мітки.

Збережіть подання та перейдіть на створену ним сторінку. Якщо у вас є більше однієї сторінки результатів, ви можете вибрати всі елементи на поточній сторінці, всі елементи на всіх сторінках, або ви можете встановити прапорці вручну відповідно до окремих вузлів. Щоб продовжити, потрібно встановити хоча б один прапорець.

Тепер ви встановлюєте значення за замовчуванням і зберігаєте його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.