Drupal 保存后回拨?
如何在每次更新节点时执行函数?我试图使用hook_nodeapi,但是看起来这个钩子已经从Drupal 7中移除了 我想做的是Drupal 保存后回拨?,drupal,hook,drupal-7,Drupal,Hook,Drupal 7,如何在每次更新节点时执行函数?我试图使用hook_nodeapi,但是看起来这个钩子已经从Drupal 7中移除了 我想做的是 在我的内容类型中添加一个名为“主映像(bool)”的新字段,以便管理员设置主映像 我将使用“视图”模块显示节点,但按“主图像”字段和添加的日期对节点进行排序 因此,第一个节点始终是主映像 为此,我需要确保始终只有一个节点的“main image”设置为true。钩子没有被移除,而是为每个$op拆分为单独的钩子 见: 对于post save,如果您想在更新节点之前执行操作
为此,我需要确保始终只有一个节点的“main image”设置为true。钩子没有被移除,而是为每个$op拆分为单独的钩子 见: 对于post save,如果您想在更新节点之前执行操作,您需要并且我想可能是您正在寻找的钩子: 在一个实体即将发生冲突之前对其采取行动 可以创建或更新
或者,如果您更喜欢在更新后表演,请查看: 更新时对实体进行操作
目前,Drupal core不提供在数据库中插入/更新/删除节点/实体后执行操作的任何钩子。例如,在插入节点后,您无法发送提及该节点的电子邮件,因为Drupal使用SQL事务,并且在调用hook node presave时,该节点尚未完全写入数据库,因此如果出于任何原因回滚该事务,用户将收到一封假邮件 因此,引入了几个新的Drupal挂钩来克服这一限制:
- 钩子\实体\后期保存
- 钩子实体后插入
- 钩形实体假设更新
- 钩子实体后删除
- 钩子\节点\后期保存
- 钩子\节点\定位插入
- 钩节点姿势更新
- hook\u node\u postdelete
为了进一步完成此操作,如果您需要在节点保存/更新后执行任何操作,您可以使用@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...
}
通过使用,您可以确保在钩子完成并且节点已在DB上持久化时调用自定义函数。另一种方法是使用自定义类扩展节点实体,并在
node::postSave
方法中调用代码。当节点被保存或更新时,将调用此方法
通过实现名为hook\u entity\u type\u build
的钩子来指定自定义扩展类,并提供新类,例如:$entity\u types['node']->setClass(NodeExtended::class)
在类中,您可以重写
postSave
方法。我通常只在这里发送我的自定义事件,以便其他模块可以订阅此节点post save事件,但这是另一个主题。您可以使用Drupal-7标记,而不是将Drupal 7添加到问题标题中,这样可以节省一些空间。@berdir//我会这样做。谢谢你根据Berdir的建议编辑了这篇文章。顺便说一下,现在有一个专门针对Drupal的Stack Exchange站点:。@marcvangend//感谢您编辑Drupal站点!此时节点尚未完全保存,因为事务尚未提交。正如Jorrit所说,这是不正确的,因为事务仍处于打开状态。从执行代码的角度来看,节点已完全保存,数据库上的查询将按预期工作并查找节点数据,因为它们将在事务内部执行。“完全保存”的定义适合OP用例。谢谢-这看起来很有用。我想在添加、删除或更新节点后重建我的sitemap.xml,这样看起来非常适合我的需要。我已经安装了它,而且一切似乎都工作得很好:)这是最小最简单的解决方案。