向已有钩子中添加触发器

老葛的Drupal培训班 Think in Drupal

有时候,如果你的代码新增了一个操作的话,那么你可能想要在一个已有的钩子上添加触发器。例如,你可能想向nodeapi钩子添加一个操作。假定你编写了一个模块,用来存档旧节点并将其迁移到数据仓库中。由于这个操作是作用于节点的,所以你可能想在nodeapi钩子下面添加一个archive操作,这样对于内容的所有操作,都会显示在触发器界面的同一个标签下。下面的代码用来添加一个额外的触发器:

 
/**
* Declare a new trigger, to appear in the node tab.
*/
function archiveoffline_hook_info() {
    $info['archiveoffline'] = array(
        'nodeapi' => array(
            'archive' => array(
                'runs when' => t('When the post is about to be archived'),
            ),
        ),
    );
    return $info;
}
    导航到触发器管理页面“管理➤站点构建 ➤触发器”,在触发器列表的最后,我们看到了新增的触发器,如图3-7所示。
3-7.额外的触发器(“当文章即将被存档”)出现在了用户界面
 
    Drupal的菜单系统将使用hook_hook_info()实现中的第一个键,来自动在触发器管理页面创建一个标签。Drupal将使用模块的.info文件中定义的模块名字作为标签的名字(参看图3-7中没有用到的Archive Offline标签)。但是我们的新触发器不需要放在它自己的标签下;通过将我们的操作添加到nodeapi钩子中,我们有意地将新触发器放在了内容标签下。我们可以使用hook_menu_alter()来删除不想要的标签(该钩子的更多详细,可参看第4章)。下面的代码将自动创建的标签,从类型MENU_LOCAL_TASK(Drupal默认将其作为标签显示)改为了类型MENU_CALLBACK,这样Drupal就不再显示它了:
 
/**
* Implementation of hook_menu_alter().
*/
function archiveoffline_menu_alter(&$items) {
    $items['admin/build/trigger/archiveoffline']['type'] = MENU_CALLBACK;
}
 
    为了让archiveoffline_menu_alter()函数起作用,我们需要访问“管理➤站点构建 ➤模块”,这样菜单将被重建。

Drupal版本: