【问题标题】:How do I execute an action in drupal after each time a node is saved?每次保存节点后如何在drupal中执行操作?
【发布时间】:2010-05-06 21:19:09
【问题描述】:

我正在 Drupal 中开发一个动作,它应该在保存节点后激活,将内容导出到 XML(包括刚刚保存的节点中的数据),使用“触发器:保存更新的帖子后”触发器.

不幸的是,此操作实际上发生在最近保存的帖子中的信息保存到数据库之前。 IE。稍后查看 XML 时,我发现我最近所做的更改并未包含在内。编辑不同节点后保存将恢复以前丢失的数据。

如何在保存过程完成后触发我的操作?

【问题讨论】:

    标签: drupal drupal-6 triggers


    【解决方案1】:

    无论您是使用触发器还是通过hook_nodeapi() (+1) 提出的 Mike Munroes 建议,在这种情况下都有一个常见的陷阱:

    只要您的导出逻辑在处理更新的同一页面周期上运行,并且它使用node_load() 来获取节点数据,node_load() 可能会返回节点之前的静态缓存版本尚未包含更改的更新。如果这是您的问题,您可以通过两种方式解决它:

    1. 通过将TRUE 作为第三个参数传递给node_load(),强制重置静态节点缓存。这将确保从数据库中新填充节点(以一些额外的数据库查询为代价,因此请注意潜在的性能影响)。
    2. 如果您使用hook_nodeapi() 路由,如果您将那里可用的$node 对象直接传递给您的导出函数,则可以完全避免调用node_load(),因为它将代表更新状态.

    【讨论】:

    • Henrik,谢谢,我尝试了您的解决方案,它准确地解决了我的问题。具体来说,node_load() 解决了缓存问题 该动作一定是在正确的时间触发的,它只是加载刚刚更新的节点的缓存副本。
    • 你也可以做 node_load(array('nid' => $nid)) ,这将绕过缓存
    【解决方案2】:

    您应该使用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();
      }
    }
    

    【讨论】:

    • 谢谢,这是一个很好的起点。我可以通过实现 hook_action_info() 来做类似的事情。不幸的是我遇到了同样的问题。如果 $op 是更新的,Drupal 不会在我运行 export_logic_function() 时考虑最新的,只是更新的更改。相反,它将从数据库中导出先前存储的结果,在此更新发生之前。看着api.drupal.org/api/function/hook_nodeapi,我似乎找不到专门用于保存后的操作。 “更新”看起来应该可以工作,除了我面临的结果。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 2021-12-17
    • 2017-01-05
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多