我想在用户和访客之间创建一个不同的菜单,这里是我正在尝试的代码
<?php
function my_module_menu() {
if(user_is_logged_in()) {
$items = array();
$items['my_module/user1']=array(
'title' => t('1. User menu 1'),
'page callback' => 'test1',
'access arguments' => array('access content'),
'type' => MENU_NORMAL_ITEM,
'expanded' => TRUE,
);
$items['my_module/user2']=array(
'title' => t('2. User Menu 2'),
'page callback' => 'test2',
'access arguments' => array('access content'),
'type' => MENU_NORMAL_ITEM,
'expanded' => TRUE,
);
}
else{
$items = array();
$items['my_module/guest1']=array(
'title' => t('1. Guest menu 1'),
'page callback' => '1test1',
'access arguments' => array('access content'),
'type' => MENU_NORMAL_ITEM,
'expanded' => TRUE,
);
$items['my_module/user2']=array(
'title' => t('2. Guest menu 2'),
'page callback' => '1test2',
'access arguments' => array('access content'),
'type' => MENU_NORMAL_ITEM,
'expanded' => TRUE,
);
}
return $items;
?>
问题是,菜单视图我只获得用户视图(用户登录)用户是否登录。我的代码有问题吗?
答案 0 :(得分:4)
问题是重建菜单时会调用hook_menu
,而不是每个页面加载都会调用(因为这对性能非常不利)。
执行所需操作的最简单方法是在菜单项中使用access callback
键而不是access arguments
键,以便即时决定用户是否已登录。由于Drupal不会显示access callback
函数返回FALSE
的任何用户的菜单项,因此您将获得所需的效果:
function mymodule_menu() {
$items['my_module/user1']=array(
'title' => t('1. User menu 1'),
'page callback' => 'test1',
'access callback' => 'user_is_logged_in',
'type' => MENU_NORMAL_ITEM,
'expanded' => TRUE,
);
$items['my_module/user2']=array(
'title' => t('2. User Menu 2'),
'page callback' => 'test2',
'access callback' => 'user_is_logged_in',
'type' => MENU_NORMAL_ITEM,
'expanded' => TRUE,
);
$items['my_module/guest1']=array(
'title' => t('1. Guest menu 1'),
'page callback' => '1test1',
'access callback' => 'user_is_anonymous',
'type' => MENU_NORMAL_ITEM,
'expanded' => TRUE,
);
$items['my_module/user2']=array(
'title' => t('2. Guest menu 2'),
'page callback' => '1test2',
'access callback' => 'user_is_anonymous',
'type' => MENU_NORMAL_ITEM,
'expanded' => TRUE,
);
return $items;
}
所有这些菜单项都会添加到同一个菜单中,但只有两个菜单项会在任何时间显示给用户。