Обновите все узлы с полем по умолчанию после добавления нового поля в тип контента

15

У меня есть существующий тип контента с несколькими узлами. Я только что добавил новое логическое поле со значением по умолчанию «off».

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

Как я могу обновить существующие узлы, созданные до добавления поля, чтобы установить для этого поля значение по умолчанию?

Danh
источник
Я решил эту проблему с помощью групповых операций и правил Views, как описано в этом фантастическом видео: commerceguys.com/resources/articles/217
DanH
Модуль Resave node может помочь вам обновить узлы.
Суприя Раджгопал

Ответы:

9

К сожалению, не существует очень простого способа сделать это (кроме VBO / rules), но вот код, который я использую в функциях обновления в моих установочных файлах моего пользовательского модуля, когда мне нужно предварительно заполнить значения полей для определенного типа узла после добавления нового поля ( в этом случае узлы «страницы»):

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

Другой ручной метод, упомянутый в этом ответе, использует EntityFieldQuery и загружает / сохраняет каждый узел. Больше Drupal-у, но гораздо менее производительный ... (требует полной загрузки узла и сохранения операции для каждого узла!).

geerlingguy
источник
Это очень грустно
AlxVallejo
Вы видели модуль Field Defaults? dgo.to/field_defaults
лес
Это ошибка для запуска кода , как это без того , промывки всех пораженных узлов из кэша загрузки объекта: entity_get_controller('node')->resetCache($nids);- в противном случае последующее node_load()может загрузить устаревшие данные из кэша, и любые node_save()из этого объекта будет написать , что несвежий данные обратно в базу данных.
Филс
2

Лучшая ставка прямо в MySQl. Таблицы будут выглядеть так:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

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

Майк
источник
Спасибо, Майк, нет, это не проблема, я действительно могу справиться с SQL. Я просто чувствую, что должна быть опция «повторного сохранения» или что-то, предоставленное как массовая операция, я думаю, что я мог бы взглянуть на интеграцию VBO и правил для этого на самом деле.
ДанХ
Понял. Я нахожусь в аналогичном положении, я перемещаю около 30 000 статей из другой CMS в Drupal. Я не видел смысла добавлять другой модуль, когда SQL был быстрым и грязным. Возможно, вы также можете написать быструю функцию, которая будет вызывать node_load () для всех ваших узлов, что также может работать.
Майк
0

Просто попробуйте следующую логику. это гораздо быстрее и обходить все реализации ловушек также. больше деталей . Вы можете написать простой прямой запрос db_select, чтобы получить все nid и зациклить его с этим примером кода.

$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

используя sql, учитывая, что узлы с не заданным значением поля

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 - таблица, соответствующая моему полю и содержащая одно значение номинала записи с идентификатором сущности, относящимся к узлу

я сделал с помощью вставки SQL ... выберите синтаксис

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)
Matoeil
источник
0

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

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

обращаться

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

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

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

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

DRUPWAY
источник
0

Я нашел простой способ обновить поля в типе контента с помощью этого модуля: Field Defaults

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

Я проверил его на D7, и он работает.

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

Себастьян Гикель
источник