我正在开发Drupal中的Action,它应该在保存节点后激活,将内容导出到XML(包括刚刚保存的节点中的数据),使用“触发器:保存更新的帖子后”触发器。
不幸的是,此操作实际上是在最近保存的帖子中的信息保存到数据库之前发生的。即。在稍后查看XML时,我发现我所做的最新更改未包括在内。编辑其他节点后保存将恢复以前丢失的数据。
如何在保存过程完成后触发我的操作?
答案 0 :(得分:6)
在此背景下存在一个常见的陷阱,无论您是通过hook_nodeapi()
(+1)使用触发器还是Mike Munroes建议:
只要您的导出逻辑在处理更新的同一页面周期上运行,并且使用node_load()
获取节点数据, node_load()
可能会返回静态缓存版本的更新之前的节点,但尚未包含更改。如果这是您的问题,您可以通过两种方式解决它:
TRUE
作为第三个参数传递给node_load()
,强制重置静态节点缓存。这将确保节点从数据库中新填充(以一些额外的数据库查询为代价,因此请注意潜在的性能影响)。hook_nodeapi()
路线,则可以避免在将node_load()
对象直接传递到导出功能时完全调用$node
,因为它将是更新状态的表示。答案 1 :(得分:5)
您应该使用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();
}
}