作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
当Drupal重构menu_router表和更新menu_link表时(比如,当一个新模块被启用时),通过实现hook_menu_alter(),模块就可以修改任意的菜单项。例如,“我的帐户”菜单项通过调用user_page(),如果当前用户是登录用户,那么就显示用户的个人资料;如果是匿名用户,则显示登录表单。由于user_page ()函数位于modules/user/user.pages.inc中,所以该Drupal路径的菜单项中定义了file键。这样,通常情况下,当一个用户点击了用户菜单中的“我的帐户”链接,Drupal会加载文件modules/user/user.pages.inc并运行user_page ()函数。
由于我们在my模块中,定义了自己的用户中心路径,我们希望当用户访问路径user的时候,能够重定向到我们新定义的个人主页。此时我可以通过hook_menu_alter钩子来修改Drupal系统自带的菜单项。在my.module文件中,添加以下内容:
/**
* 实现 hook_menu_alter().
*/
function my_menu_alter(&$items){
$items['user']['page callback'] = 'my_user_page';
$items['user']['file'] = 'my.pages.inc';
$items['user']['file path'] = drupal_get_path('module', 'my');
}
向my.pages.inc中添加对应的回调函数:
/**
* 菜单项user的回调函数.
*/
function my_user_page(){
global $user;
if($user->uid > 0){
drupal_goto('my');
}else{
//drupal_goto('user/login');
return drupal_get_form('user_login');
}
}
在我们的hook_menu_alter()钩子函数运行以前,user路径的菜单项应该是这样的:
array(
'title' => 'User account',
'title callback' => 'user_menu_title',
'page callback' => 'user_page',
'access callback' => TRUE,
'file' => 'user.pages.inc',
'weight' => -10,
'menu_name' => 'user-menu',
);
当我们修改了它以后,就变成了这样:
array(
'title' => 'User account',
'title callback' => 'user_menu_title',
'page callback' => 'my_user_page',
'access callback' => TRUE,
'file' => 'my.pages.inc',
'file path' => drupal_get_path('module', 'my'),
'weight' => -10,
'menu_name' => 'user-menu',
);
清除缓存,当我们再次访问“我的帐户”链接时,系统就会重定向到我们新定义的页面。
注意这里面,由于我们将my_user_page定义在了my.pages.inc中,所以此时我们还需要明确的定义$items['user']['file path'],否则系统就会默认的在modules/user目录下查找这个文件,并显示无法打开相应文件的错误信息。
图 3-15.注释掉 'file path'的定义信息,就会报错。