0

我正在尝试在删除内容之前执行一些代码。规则模块有事件

  • 更新现有内容后
  • 保存内容之前
  • 保存新内容后
  • 删除内容后

但是,这些都没有在正确的时间执行我的代码。

我发现了一个名为Predelete的简单模块,它提供了在删除之前执行代码的钩子。这似乎是调用规则事件的绝佳候选人。

因此,我基于 Predelete 中包含的“predelete_field”示例模块创建了一个非常简单的模块。该文件夹名为“predelete_field”,位于“modules”文件夹中,包含以下文件:

1:predelete_field.info

   core = "7.x"
   dependencies[] = "rules"
   dependencies[] = "list"
   dependencies[] = "predelete"
   description = "Example for the predelete module with a content type and a node"
   name = "Predelete Field"
   package = Other
   project = "predelete_field"
   version = "7.x-1.0"

   ; Information added by drupal.org packaging script on 2011-07-11
   version = "7.x-1.1"
   core = "7.x"
   project = "predelete"
   datestamp = "1310360219"

2:predelete_field.module

<?php

/**
 * Implements hook_predelete_node().
 */
function predelete_field_predelete_node($node) {

  drupal_set_message( "PREDELETE HOOK CALLED", 'warning' );

  rules_invoke_event('predelete_field', $node);

  $deletable = TRUE;
  $reason = t('Deletable by default.');

  return array('result' => $deletable, 'reason' => $reason);
}

3: predelete_field.rules.inc

<?php

/**
 * Implements hook_rules_event_info() on behalf of the predelete_field module.
 */
function rules_predelete_field_event_info() {
  $items = array(
    'predelete_field_predelete' => array(
      'label' => t('Before deleting content'),
      'group' => t('Node'),
    ),
  );

  return $items;
}

不幸的是,这似乎不起作用:该事件不会显示在事件列表中,即使在清除缓存并禁用和重新启用模块之后也是如此。同样,该drupal_set_message函数似乎不会触发。

是否有人能够发现我可能犯的任何错误或提供解决方案?

4

1 回答 1

0

Predelete 模块似乎只是连接到多个节点删除的确认表单中,它永远不会使用规则触发,因为规则不会调用表单而是使用节点 API。

如果您查看该node_delete_multiple()函数,您会发现在实际从数据库中删除任何内容之前调用了几个钩子(即hook_node_deleteand hook_entity_delete)。其中之一是您要在自定义模块中实现的钩子,如下所示:

function mymodule_node_delete($node) {
  // Perform some action based on values in $the node object.
  // Nothing has been deleted from the database at this point.
}

添加该钩子后,您需要再次清除 Drupal 的缓存,但根据文档,它应该可以工作。

于 2011-12-12T22:55:59.487 回答