You are here

实现一个钩子

老葛的Drupal培训班 Think in Drupal

回想一下,我们曾经说过Drupal是建立在钩子系统之上,有时候钩子也被称为回调。在执行的过程中,Drupal询问模块看它们是不是想要做些事情。举例来说,为了判定哪一个模块负责当前的请求,它向所有的模块询问是否提供了相应的路径。通过创建一个所有模块的列表,并且调用每个模块中名为:模块名+_menu的函数,来实现这一点。当它遇到我们的annotate模块时(应该会比较早的遇到,因为模块列表默认是按照字母顺序排列的),它调用函数annotate_menu(),后者返回一个包含菜单项的数组。每一项(我们这里只有一项)都以路径为键,在这里就是admin/settings/annotate。菜单项的值是一个数组,里面包含的键和值是用来描述在该路径被请求时Drupal要做什么的。这方面的更多详细,可参看第4章
,该章讲述了Drupal的菜单/回调系统。下面给我们模块添加点内容:
 
/**
* Implementation of hook_menu().
*/
function annotate_menu() {
    $items['admin/settings/annotate'] = array(
        'title' => 'Annotation settings',
        'description' => 'Change how annotations behave.',
        'page callback' => 'drupal_get_form',
        'page arguments' => array('annotate_admin_settings'),
        'access arguments' => array('administer site configuration'),
        'type' => MENU_NORMAL_ITEM,
        'file' => 'annotate.admin.inc',
    );
 
    return $items;
}
    此时不要过于关注这里的具体细节。这段代码说,“当用户访问页面http://example.com/?q=admin/settings/annotate时,调用函数drupal_get_form,并向它传递了一个表单ID annotate_admin_settings,在文件annotate.admin.inc中查找描述该表单的函数。只有具有管理站点配置权限的用户才有权查看这个菜单。”当需要显示表单时,Drupal就会让我们提供一个表单定义(一会儿就对这一点详细讲解)。当Drupal完成了向所有的模块询问它们的菜单项时,它就为正被请求的路径找到一个菜单,根据这个菜单就会找到一个要被调用的函数。
 
注意 如果你对钩子机制感兴趣的话,参看文件includes/module.inc里面的函数module_invoke_all()。
 
    现在你应该清楚我们为什么把它叫作hook_menu()或者菜单钩子了。可以通过在钩子的名字前加上你的模块名来创建Drupal钩子。
 
提示 Drupal的钩子几乎允许你修改这个软件的任何方面。你可以在Drupal的API文档站点(http://api.drupal.org)上,找到Drupal钩子的完整列表和它们的使用说明。
 

Drupal版本: