Как выполнить действие в drupal после каждого сохранения узла?
Я разрабатываю действие в Drupal, которое предполагается активировать после сохранения узла, экспортируя контент в XML (который включает данные с только что сохраненного узла), используя триггер "триггер: после сохранения обновленного сообщения".
к сожалению, это действие на самом деле происходит прямо перед тем, как информация из недавно сохраненного сообщения сохраняется в базе данных. то есть. когда я смотрю на XML позже, я нахожу, что самое последнее изменение, которое я сделал, не было включено. Сохранение после редактирование другого узла восстановит ранее отсутствовавшие данные.
Как я могу заставить мое действие выстрелить после завершения процесса сохранения?
2 ответов
в этом контексте есть общая ловушка, независимо от того, используете ли вы триггер или предложение Майка Манроуза через hook_nodeapi()
(+1):
пока ваша логика экспорта работает на том же цикле страницы, который обработал обновление, и он использует node_load()
чтобы получить данные узлов,node_load()
может возвращать статически кэшированную версию узла до обновления, которая еще не содержит изменений. Если это проблема в вашем случае, вы можете обойти ее в два раза пути:
- принудительно сбросить статический кэш узла, передав
TRUE
в качестве третьего параметраnode_load()
. Это гарантирует, что узел будет заполнен свежим из базы данных (по цене некоторых дополнительных запросов к БД, поэтому имейте в виду потенциальное влияние на производительность). - если вы собираетесь в
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();
}
}