如何在drupal 7中为用户和访客制作不同的菜单视图?

时间:2011-11-12 03:56:45

标签: php drupal drupal-7

我想在用户和访客之间创建一个不同的菜单,这里是我正在尝试的代码

<?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;
?>

问题是,菜单视图我只获得用户视图(用户登录)用户是否登录。我的代码有问题吗?

1 个答案:

答案 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;
}

所有这些菜单项都会添加到同一个菜单中,但只有两个菜单项会在任何时间显示给用户。