Как я выполняю действие в drupal после каждого раза, когда узел сохраняется?

Я разрабатываю Действие в Drupal, который, как предполагается, активируется после сохранения узла, экспортируя содержание в XML (который включает данные из узла, который был просто сохранен), с помощью "Триггера: После сохранения обновленного сообщения" триггер.

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

Как я могу заставить свое действие стрелять после того, как процесс сохранения будет завершен?

6
задан ford 6 May 2010 в 21:19
поделиться

2 ответа

В этом контексте есть распространенная ошибка, независимо от того, используете ли вы триггер или предложение Майка Манроуса через hook_nodeapi () (+1):

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

  1. Принудительно сбросить статический кеш узлов, передав TRUE в качестве третьего параметра в node_load () . Это обеспечит свежее заполнение узла из базы данных (за счет некоторых дополнительных запросов к базе данных, поэтому следует помнить о потенциальном влиянии на производительность).
  2. Если вы идете по маршруту hook_nodeapi () , вы можете вообще избежать необходимости вызывать node_load () , если передадите доступный объект $ node прямо к вашей функции экспорта, так как это будет представление обновленного состояния.
6
ответ дан 9 December 2019 в 22:30
поделиться

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

пример, где имя модуля = 'export_to_xml':

 /**
 * Implementation of hook_nodeapi().
 */
function export_to_xml_nodeapi(&$node, $op, $a3, $a4) {
  if ($op == 'update' || $op == 'insert') {
    export_logic_function();
  }
}
5
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: