Оновіть усі вузли з полем за замовчуванням після додавання нового поля до типу вмісту


15

У мене є існуючий тип вмісту з кількістю вузлів. Щойно я додав нове булеве поле зі значенням за замовчуванням "вимкнено".

Однак, поки я не збережу кожен вузол, значення за замовчуванням не встановлено, тому представлення, яке повинно показувати лише ті вузли, у якому в новому полі використовується значення за замовчуванням, наразі порожнє.

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


Я вирішив цю проблему, використовуючи «Масові операції та правила перегляду», як викладено в цьому фантастичному відео: commerceguys.com/resources/articles/217
DanH

Модуль збереження вузлів може допомогти вам примусити вузли оновлення.
Супрія Раджгопаль

Відповіді:


9

На жаль, немає дуже простого способу зробити це (окрім VBO / правил), але ось код, який я використовую для функцій оновлення в моєму власному модулі встановлення файлів, коли мені потрібно перегрупувати значення полів для певного типу вузла після додавання нового поля ( у цьому випадку вузли "сторінки":

<?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-y, але набагато менш продуктивні ... (вимагає повного завантаження вузла та збереження операції для кожного вузла!).


Це дуже сумно
AlxVallejo

Ви бачили модуль за замовчуванням у полі? 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 та правил.
DanH

Зрозумів. Я в подібній позиції, я переношу близько 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/uk/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)

0

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

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

Зверніться

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

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

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

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


0

Я знайшов простий спосіб оновлення полів у типах вмісту за допомогою цього модуля: Поле за замовчуванням

Дивіться знімок екрана. Ви можете оновити наявний вміст за допомогою значень за замовчуванням або зберегти існуючі значення.

Я тестував його на D7 і він працює.

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

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