Почему entity_metadata_wrapper-> save () не обновляет ревизию узла?

8

Я разрабатываю модуль для обновления узлов (включить ревизию). Похоже на это.

 $nodes = node_load_multiple(array(), array('type' => $bundleType));
 foreach ($ndoes as $node){
    $w = entity_metadata_wrapper('node',$node);
    $w->MyFields->set($someValue);
    $w->save();
 }

Он установил поля правильно, но идентификатор ревизии узла не изменился после $w->save().

Как я могу обновить идентификатор ревизии?

zhuchun
источник
create new revisionУстановлен ли флаг на узле для типа контента? Вы пробовали как $w->revision->set(1);перед сохранением? ....
Tenken
Да, "создать новую ревизию" включено. Я не знаю много о $w->revision->set(1)том, это ручной способ сообщить друпалу, что узел был обновлен? Я попробую.
жучун
хм, $w->revision->set()работает. Кажется, я неправильно понимаю $w->save(). Я думал, что это должно увеличить идентификатор ревизии автоматически при сохранении. Есть ли способ получить следующий номер версии? Спасибо
Жучун
нет, revision->set(1)велит узлу записать новую ревизию о предстоящем / текущем редактировании узла. Я не уверен, почему оболочка метаданных не видит глобальную настройку создания новой ревизии ... но установка флага ревизии - очень простой обходной путь, как вы теперь видели. Я предоставил свой комментарий в качестве ответа ниже, если вы хотите поднять его, чтобы помочь другим пользователям в будущем найти правильный ответ.
Tenken

Ответы:

6

Установлен ли на узле флаг создания новой редакции для типа контента? Вы пробовали как $ w-> revision-> set (1); перед сохранением? ....

РЕДАКТИРОВАТЬ:

Автор говорит, что установка $w->revision->set(1)решает его проблему.

tenken
источник
Это простой обходной путь! Просто не понимаю, зачем это нужно, лол. Спасибо!
жучун
10

Когда вы редактируете узел через пользовательский интерфейс, это делается через node_form(). Это вызов в верхней части node_object_prepare(), который устанавливает значения по умолчанию для этого узла. Это включает в себя установку значения по умолчанию $node->revision, которое используется, node_save()чтобы определить, нужна ли новая ревизия или нет.

Entity API поддерживает ревизии, но node_object_prepare()это специфическая для узла вещь. Это означает, что вам нужно самим управлять значениями, в том числе задавать свойство revision для имитации действий формы редактирования узла.

mpdonadio
источник
7

Ни один из этих ответов на самом деле не является правильным, ->set(1)это звучит так, как будто вы фактически меняете номер ревизии и, следовательно, должны увеличивать его.

На самом деле это просто логический флаг, поэтому правильный ответ $node->revision->set(true);

Как говорит Жучун: он не понимает, зачем это нужно, когда его объясняют как логический флаг, он имеет смысл, а не число.

Gav_
источник
Было время, когда создание нового друпальского контента включало, drupal_submit_formк примеру, самый простой вызов . Если вы проверите значения POST для формы отправки узла, вы увидите такие вещи, как revision = 1в полях POST, потому что create new revisionфлажок элементов формы был отмечен. Поскольку 1 == TRUEкод работает в любом случае. Но ваша точка зрения верна.
Tenken
на это должен быть принят ответ
Алексей Скрипник
0

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

$w->revision = TRUE;

что точно так же, как использование:

$w->revision->set(TRUE);

но с меньшим набором текста требуется.

Fonant
источник