Обертки метаданных сущностей
API-интерфейс сущности предоставляет некоторые классы-обертки, которые вы можете использовать для упрощения работы с сущностями и для использования предоставленных информационных модулей свойств сущностей. С помощью упаковщиков вы можете получить доступ к информации о свойствах, просмотреть известные свойства или просто получить / установить значения описанных данных и т. Д.
Вот несколько простых примеров использования, которые можно найти в README:
Для использования этой информации (метаданных) модуль предоставляет несколько классов-оболочек, которые облегчают получение и установку значений. Оболочка поддерживает цепное использование для извлечения оберток свойств сущностей, например, чтобы получить почтовый адрес автора узла, который можно использовать:
$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();
Для обновления почтового адреса пользователя можно использовать
$wrapper->author->mail->set('sepp@example.com');
или
$wrapper->author->mail = 'sepp@example.com';
Оболочки всегда возвращают данные, как описано в информации о свойствах, которая может быть получена непосредственно через entity_get_property_info () или из обертки:
$mail_info = $wrapper->author->mail->info();
Чтобы принудительно получить текстовое значение, очищенное для вывода, можно использовать, например,
$wrapper->title->value(array('sanitize' => TRUE));
получить очищенный заголовок узла. Когда свойство уже возвращено очищенным по умолчанию, как и тело узла, возможно, требуется получить необработанные данные так, как они будут отображаться в браузере для других вариантов использования. Для этого можно включить опцию «decode», которая гарантирует, что для любых очищенных данных теги удаляются, а объекты HTML декодируются до того, как возвращается свойство:
$wrapper->body->value->value(array('decode' => TRUE));
Таким образом, каждый всегда получает данные, как показано пользователю. Однако, если вы действительно хотите получить необработанное необработанное значение даже для очищенных текстовых данных, вы можете сделать это с помощью:
$wrapper->body->value->raw();
Больше примеров:
$wrapper->body->set(array('value' => "content"));
$wrapper->field_text[0] = 'the text';
$wrapper->field_text[0]->set(array('value' => "content"));
$wrapper->field_text2->summary = 'the summary';
$wrapper->field_text2->value = 'the text';
$wrapper->save();
$wrapper->delete();
Больше документов : http://drupal.org/node/1021556
Звонок
field_attach_update('node', $node)
в концеhook_node_update
сработал для меня. Я предполагаю, чтоfield_attach_insert('node', $node)
в концеhook_node_insert
тоже будет работать. Итак, пример функции будет выглядеть так:Там нет необходимости звонить
node_load
node_save
или возвращать что-либо.Я думаю, что причина этого заключается в том
node_save
, что , откудаhook_node_update
иhook_node_insert
вызываются, оборачивает все запросы к базе данных в транзакции. (Обратите внимание на первую строкуnode_save
:.$transaction = db_transaction()
) Эти запросы не вызываются доnode_save
завершения. Последний запрос, которыйnode_save
добавляет к транзакции, вызывается изfield_attach_update
, который использует объект $ node, как и прежде,hook_node_update
вызывается. Поэтому вам нужно поставить в очередь другой запрос, позвонивfield_attach_update
снова. По крайней мере, это мое понимание того, что происходит.Если у вас возникли проблемы с изменением неполевых атрибутов узла (например,
$node->log
), попробуйте_node_save_revision($node, $user->uid, 'vid');
тоже позвонить . Это не создаст новую ревизию.источник
Вот как вы меняете значения на узле:
источник
und
здесь не совсем уместно, OP уже указал в коде, который они используют$node->language
для кода языкаУлучшение решения Lance, описанное выше, позволяет избежать сохранения всего узла при изменении только нескольких значений поля:
Это также может быть полезно, чтобы избежать побочных эффектов
node_save()
.Источник: сохранение полей узла без сохранения самого узла
https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself
источник