Как выполнить действие в drupal после каждого сохранения узла? - PullRequest
6 голосов
/ 07 мая 2010

Я разрабатываю Action в Drupal, который должен активироваться после сохранения узла, экспортируя контент в XML (который включает в себя данные только что сохраненного узла), используя триггер «После сохранения обновленной публикации» ,

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

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

Ответы [ 2 ]

6 голосов
/ 07 мая 2010

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

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

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

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