Как сделать разные представления меню для пользователя и гостя в drupal 7? - PullRequest
2 голосов
/ 12 ноября 2011

Я хочу сделать другое меню между пользователем и гостем, вот код, который я пытаюсь

<?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 Ответ

4 голосов
/ 12 ноября 2011

Проблема в том, что 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;
}

Все эти пункты меню будут добавлены в одно и то же меню, но только два из них будут отображаться для пользователя одновременно.

...