Как я могу отобразить / скрыть пункты меню с Zend Framework - PullRequest
3 голосов
/ 09 сентября 2011

[см. Обновление в конце]

Я работаю с Zend Framework, в PHP, и у меня есть некоторые трудности с Zend Navigation. Это мой первый вопрос, так что если что-то не так, просто скажите мне, и я исправлю это.

В моем приложении есть меню, похожее на это

Home 
Login
Logout
Member's Page

У меня есть XML-файл навигации, содержащий мое меню.

<nav>
 <home>
    <label>Home</label>
    <uri>/</uri>
 </home>
 <login>
    <label>Login</label>
    <uri>/index/login</uri>
 </login>
 <logout>
    <label>Logout</label>
    <uri>/index/logout</uri>
 </logout>
 <member>
    <label>Member's Page</label>
    <uri>/index/member</uri>
 </member>
</nav>

Также menu.phtml, содержащий это

<div class="top-level">
<?php
foreach ($this->container as $page) {
    if ($page->isVisible()) {
        if ($page->isActive(true)) {
            if ($page->isActive(false)
                )$page->setClass("active");
            else
                $page->setClass("open");
            echo $this->navigation()->menu()->htmlify($page);
//... the same continue for the 3 menu level

Наконец, в моем layout.phtml у меня есть это для отображения меню

<?php
      $partial = array('menu.phtml', 'default');
      $this->navigation()->menu()->setPartial($partial);
      echo $this->navigation()->menu()->render();
?>

Пока что мое меню работает хорошо, но у меня не всегда могут отображаться Логин и Выход из системы. Итак, что мне нужно сделать, это скрыть Логин, когда я вошел в систему, и скрыть Выход из системы, когда я вышел из системы. Когда я начинал, это выглядело довольно просто, но до сих пор работает, но я не могу заставить его работать. Я не знаю, как и если я могу скрыть и показать элемент в зависимости от зарегистрированных пользователей. Мне действительно нужно, чтобы это работало, потому что в будущем мне нужно будет скрывать / отображать другие элементы.

Так есть ли способ сделать это?

Спасибо!

РЕДАКТИРОВАТЬ:

В настоящее время я не использую Zend :: Auth или Zend_ACL для ролей и авторизации. Если я хочу узнать, вошел ли пользователь в систему или нет, у меня в сеансе есть токен, который действителен только при входе в систему пользователя. Я бы хотел, чтобы мое меню работало без изменения, если это возможно.

ОБНОВЛЕНИЕ:

Я работал иначе, чем предполагалось. Я действительно не уверен, что это чистый путь, но сейчас он выполняет свою работу. Итак, теперь мой XML-файл навигации выглядит как

<menuAnonymous>
     <home>
     <label>Login</label>
        <uri>/login</uri>
     </home>
    </menuAnonymous>
    <menuLogged>
     <home>
        <label>Logout</label>
        <uri>/Logout</uri>
     </home>
    </menuLogged>

Я инициализирую оба в моей начальной загрузке вот так.

$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'menuNotLogged');    
$container = new Zend_Navigation($config);
Zend_Registry::set('main',$container);

А потом, в моем макете, я смотрю на свой токен и отображаю меню в зависимости от этого.

if ($tokenValid) {
     echo $this->navigation()->menu()->render(Zend_Registry::get('main')); 
} else {
     echo $this->navigation()->menu()->render(Zend_Registry::get('logged'));
}

Так что теперь это работает так, как я хочу, но я все еще хочу сделать это чище, так что если у вас есть какие-либо предложения, чтобы помочь мне ... спасибо!

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Я обновил свой вопрос с помощью решения, которое я использовал, может быть, я найду лучший способ сделать это позже, но сейчас это оно. Я не нашел здесь решения, поэтому отвечаю на свой вопрос. Спасибо за вашу помощь!

1 голос
/ 09 сентября 2011

Вам следует взглянуть на вебинар «Использование Zend_Navigator» на http://www.zend.com/en/resources/webinars/framework. В нем объясняется, как вы можете связать навигацию с конкретными ролями / ACL.

...