12 修改其它模块定义的菜单项

作者:老葛,北京亚艾元软件有限责任公司,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目录下查找这个文件,并显示无法打开相应文件的错误信息。

图片1.png 

    3-15.注释掉 'file path'的定义信息,就会报错。

 


Drupal版本: