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