老葛的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()函数起作用,我们需要访问“管理➤站点构建 ➤模块”,这样菜单将被重建。