Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drupal 保存后回拨?_Drupal_Hook_Drupal 7 - Fatal编程技术网

Drupal 保存后回拨?

Drupal 保存后回拨?,drupal,hook,drupal-7,Drupal,Hook,Drupal 7,如何在每次更新节点时执行函数?我试图使用hook_nodeapi,但是看起来这个钩子已经从Drupal 7中移除了 我想做的是 在我的内容类型中添加一个名为“主映像(bool)”的新字段,以便管理员设置主映像 我将使用“视图”模块显示节点,但按“主图像”字段和添加的日期对节点进行排序 因此,第一个节点始终是主映像 为此,我需要确保始终只有一个节点的“main image”设置为true。钩子没有被移除,而是为每个$op拆分为单独的钩子 见: 对于post save,如果您想在更新节点之前执行操作

如何在每次更新节点时执行函数?我试图使用hook_nodeapi,但是看起来这个钩子已经从Drupal 7中移除了

我想做的是

  • 在我的内容类型中添加一个名为“主映像(bool)”的新字段,以便管理员设置主映像
  • 我将使用“视图”模块显示节点,但按“主图像”字段和添加的日期对节点进行排序
  • 因此,第一个节点始终是主映像

  • 为此,我需要确保始终只有一个节点的“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,这样看起来非常适合我的需要。我已经安装了它,而且一切似乎都工作得很好:)这是最小最简单的解决方案。