保存后的动作可以使用哪个挂钩?


16

我已经找到了几条关于同一问题的帖子,但是答案总是与其他主题有所不同,否则它们将无法满足我的需求。

保存节点后,我想让我的自定义模块在我的一个自定义表中插入一行,其中包含新节点的编号。当hook_node_submit被调用时,nid还不存在。hook_node_insert确实有好处,但是仅在第一次保存节点时才被调用,但是每次保存节点时我可能都需要采取措施。

我的计划是将功能分解为自己的方法并实现两个钩子,但是我试图学习使用Drupal正确地做事,所以我想知道是否有一个钩子实际上符合我的要求。

是否存在一个钩子,每次保存节点时都会调用该钩子,并在保存完成后调用该钩子?


3
你可以使用的组合hook_node_inserthook_node_update(动作每次节点正在保存时间)。
AjitS

是的,我在上面的帖子中对此进行了描述。
肯尼·怀兰德

您提到的@KennyWyland hook_node_submit但没有hook_node_update
大卫·托马斯

您将在hook_node_insert和中获得节点nid hook_node_update
Sumit Madan

2
hook_node_insert()并且hook_node_update()是正确的钩子,hook_node_submit()在保存节点之前在表单提交过程中被调用。不要忘记,
Clive

Answers:


5

查看有关该问题的评论,似乎显而易见的解决方案是使用钩子hook_node_insert()hook_node_update()

实际上,我所做的事情与答案中所描述的非常相似:我编写了一个函数,该函数在每次创建/更新节点时都会执行我想做的事情,然后从每个钩子中调用它。它工作正常。


这很酷!您甚至可以从中执行此操作hook_form_alter()drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx该方法的缺点是仅当通过特定形式插入/更新节点时才会调用该方法。就我而言,我需要捕获节点的所有添加和修改。
甜甜圈

12

正确的做法是尊重Drupal的db事务。如果要在hook_node_insert中执行任何数据库操作,则必须考虑尚未实际保存该节点。这意味着如果失败并回滚,您最终将在数据库中得到孤立数据。因此,应使用Drupal数据库API,而不应直接执行查询。

如果要在hook_node_insert中更新节点本身,则不能执行此操作,因为无法使用node_save,因为该节点尚未保存在数据库中,调用该节点会导致异常。一种解决方案是使用register_shutdown_function函数并传递nid,您可以使用node_load来确保它确实已保存,然后在新节点上执行您可能想要的任何其他操作。

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

更新:您还可以在这里找到更简单的替代方法/programming//a/24035797/1726778


1
好主意。虽然最好使用drupal_register_shutdown_function()。但要知道,他们两人似乎都在php-fpm的环境问题,请参阅drupal.stackexchange.com/q/102603/10667
舍夫丘克

我在检查节点是否充当有机组时遇到麻烦og_is_group。我想因为这个原因我得到了假阴性。
icicleking '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.