2011-12-12 82 views
0

我试图在删除内容之前执行一些代码。规则模块具有在模块中创建新事件

  • 事件更新现有内容
  • 将内容保存
  • 保存新的内容
  • 删除内容

但之后经过前处理后,这些都不执行我的代码在合适的时间。

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

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

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; 
} 

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

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

回答

0

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

如果您查看node_delete_multiple() function,虽然您会看到在从数据库中实际删除任何内容之前会调用多个挂钩(即hook_node_deletehook_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的缓存,当你添加的那个勾,但根据文档它应该工作。