保存后回调?

时间:2011-03-15 07:00:41

标签: drupal hook drupal-7

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

我想做的是,

  1. 在我的内容类型中添加一个名为“main image(bool)”的新字段,让管理员设置主图像。
  2. 我将使用“视图”模块显示节点,但按“主图像”字段和添加日期对节点进行排序。
  3. 以便第一个节点始终是主图像。
  4. 要做到这一点,我需要确保只有一个节点'main image'设置为true。

5 个答案:

答案 0 :(得分:13)

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

所以Hook Post Action module引入了几个新的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

答案 1 :(得分:8)

钩子没有被移除,而是分成每个$ op的单独钩子。

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

对于保存后保存,您需要hook_node_insert()hook_node_update()

答案 2 :(得分:7)

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

  

在实体即将发布之前采取行动   创建或更新。


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

  

更新时对实体采取行动。

答案 3 :(得分:3)

只需更新一点,如果您需要在节点保存/更新后执行任何操作,您可以使用模块@sina-salek推荐您或您可以使用此代码:

^15.0.8

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

答案 4 :(得分:0)

另一种实现方法是通过使用自定义类扩展Node实体并在Node::postSave方法内调用代码。保存或更新节点时将调用此方法。

您可以通过实现名为hook_entity_type_build的钩子来指定自定义扩展类,并提供新类,例如:$entity_types['node']->setClass(NodeExtended::class)

在您的类内部,您将覆盖postSave方法。我通常只是在这里调度我的自定义事件,以便其他模块可以订阅该节点发布后的事件,但这是另一个主题。