Zend_Navigation: получение только страниц, доступных текущему пользователю / роли - PullRequest
2 голосов
/ 24 февраля 2011

У меня работает Zend_Navigation с данными, предоставленными файлом navigation.xml.Давайте предположим, что первый уровень (0) состоит из двух страниц, Frontend и Backend.Внешний интерфейс доступен для гостевой роли, а внутренний - только для роли администратора.

Если я

<?php echo $this->navigation()->menu()->setMaxDepth(0); ?>

, он корректно отображает ссылку "Внешний интерфейс", когда не вошел в систему, и обаСсылки «Frontend» и «Backend» при входе в систему с правами администратора.

Однако отображение ссылки «Frontend» не имеет особого смысла для гостей, поскольку у них нет других страниц для перехода кна этом уровне в любом случае.Так что я бы предпочел не показывать эту навигацию для гостей.

Я знаю, что мог бы сделать

<?php
if ('guest' !== $this->view->role) {
    echo $this->navigation()->menu();
}
?>

, но я надеюсь, что лучший способ сделать это.

Я ищу что-то вроде

<?php
if (count($this->navigation()->getPagesForRole($this->view->role)) > 1) {
    echo $this->navigation()->menu();
}
?>

Я не могу понять, как этого добиться с помощью API, предоставляемого Zend_Navigation ... Я вижу, что есть метод getPages (), ноон возвращает все страницы «нефильтрованными».

Я предполагаю, что есть простое решение, но я пытался выяснить это в течение последних двух часов и ничего не нашел, так что, думаю, я ищув неправильном направлении.

Спасибо за ваше время.

Редактировать:

Я забыл упомянуть, что навигация уже использует ACL для управления привилегиямии работает нормально.Моя единственная проблема в том, что я не хочу отображать навигацию Frontend / Backend для гостей, потому что навигация только по одному элементу ссылки довольно бесполезна.Извините за путаницу.

Ответы [ 3 ]

5 голосов
/ 24 февраля 2011

Zend Navigation для этого требуется экземпляр Zend_Acl.Вы должны настроить свой Navigation config так, чтобы он включал информацию о ресурсах / привилегиях, например,

$navArray = array(
…, 
    array(
       'module' => 'admin',
       'label' => 'Administration',
       'resource' => 'admin',
       'privilege' => 'index',
       'pages' => array( 
    …
);

См. http://framework.zend.com/manual/en/zend.navigation.containers.html

Затем вам нужно установить ACL, определяющий любые ограничения доступа для этих ресурсов и привилегий.

  $acl = new Zend_Acl();
  $acl->addRole(new Zend_Acl_Role('user'))
      ->addRole(new Zend_Acl_Role('admin'));

  …

См. http://framework.zend.com/manual/en/zend.acl.introduction.html

Ваш ACL должен быть установлен в качестве помощника по навигации вместе с ролью текущего пользователя

$this->getHelper('Navigation')
    ->setAcl($acl)
    ->setRole('user');

После этогоЛюбые обращения к вспомогательному API должны учитывать ACL.В приведенном выше примере меню администратора не должно отображаться, если пользователю запрещен доступ к нему в ACL.

Дополнительные ресурсы:

0 голосов
/ 24 февраля 2011

Вы можете интегрировать Zend_Acl с Zend_Navigation. Смотрите здесь .

0 голосов
/ 24 февраля 2011

Вы можете использовать Zend_ACL для этого
Zend_Navigation может работать с ним

...