保存后回调?

Moo*_*oon 10 hook drupal drupal-7

每次更新节点时如何执行函数?我试图使用hook_nodeapi,但看起来钩子从Drupal 7中删除了.

我想做的是,

  1. 在我的内容类型中添加一个名为"main image(bool)"的新字段,让管理员设置一个主图像.
  2. 我将使用视图模块来显示节点,但按"主图像"字段和添加日期对节点进行排序.
  3. 这样第一个节点始终是主图像.

要做到这一点,我需要确保始终只有一个节点'main image'设置为true.

小智 13

目前,在数据库中插入/更新/删除节点/实体后,Drupal核心不提供任何挂钩来执行操作.例如,在插入节点后,您无法发送提及节点的电子邮件,因为Drupal使用SQL事务,并且当调用钩子节点presave时节点尚未完全写入数据库,因此如果由于任何原因事务被回滚,则用户将收到虚假邮件.

所以Hook Post Action模块引入了几个新的Drupal钩子来克服这个限制:

  • hook_entity_postsave
  • hook_entity_postinsert
  • hook_entity_postupdate
  • hook_entity_postdelete
  • hook_node_postsave
  • hook_node_postinsert
  • hook_node_postupdate
  • hook_node_postdelete

https://drupal.org/project/hook_post_action

  • 谢谢-这看起来很有用。我想在添加,删除或更新节点之后重建我的sitemap.xml,因此这看起来很适合我的需求。我已经安装了它,而且一切似乎也都很好:) (2认同)

Ber*_*dir 8

钩子没有被移除,但是为每个$ op拆分成单独的钩子.

请参阅:http://api.drupal.org/api/search/7/hook_node

对于post-save,你需要hook_node_insert()hook_node_update()

  • 此时节点未完全保存,因为尚未提交事务. (4认同)
  • 正如Jorrit所说,这是不正确的,因为交易仍然是开放的. (2认同)
  • 从执行代码的角度来看,节点是完全保存的,对数据库的查询将按预期工作并找到节点数据,因为它们将在事务内执行。“完全保存”的这个定义适合 OP 用例。 (2认同)

Pas*_*TIN 7

hook_entity_presave如果您想在节点更新之前采取行动,我想可能是您正在寻找的钩子:

在即将创建或更新实体之前对其进行操作.


或者,如果您希望在更新后采取行动,请查看hook_entity_update:

更新时对实体采取行动.


Sal*_* P. 6

只是为了多完成一点,如果您需要在节点保存/更新后执行任何操作,您可以使用@sina-salek 推荐的模块,或者您可以使用以下代码:

// Same for hook_node_save!
function my_module_node_update($node) {
  if ($node->type == 'content_type_name') {
    // Invoke your callback function AFTER the node is updated.
    drupal_register_shutdown_function('_my_module_the_function_to_call', $node);
  }
}


function _my_module_the_function_to_call($node) {
  // do stuff...
}
Run Code Online (Sandbox Code Playgroud)

通过使用drupal_register_shutdown_function,您可以确保在挂钩完成并且节点已保留在数据库上时调用您的自定义函数。