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

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

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

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

2 ответов


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

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

  1. принудительно сбросить статический кэш узла, передав TRUE в качестве третьего параметра node_load(). Это гарантирует, что узел будет заполнен свежим из базы данных (по цене некоторых дополнительных запросов к БД, поэтому имейте в виду потенциальное влияние на производительность).
  2. если вы собираетесь в hook_nodeapi() маршрут, вы можете избежать необходимости вызова node_load() в целом, если вы проходите $node объект доступен там непосредственно к вашей функции экспорта, как это будет представление обновленного состояния.

вы должны использовать 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();
  }
}