如何使用Zend Framework显示/隐藏菜单项?


How can I display/hide menu items with Zend Framework

我正在使用Zend框架,在PHP中,我在Zend导航方面有一些困难。这是我在这里的第一个问题,所以如果有什么问题,请告诉我,我会改正的。

我的应用程序中有一个像这样的菜单

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>

也是一个菜单。包含

的php
<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

最后,在我的布局。我用这个来渲染菜单

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

现在,我的菜单工作得很好,但我不能有登录和注销总是显示在我的菜单。我需要做的是,当我登录时隐藏Login,当我注销时隐藏Logout。当我开始的时候,它看起来很简单,现在仍然如此,但我不能使它工作。我不知道如何,如果我可以隐藏和显示项目取决于登录用户。我真的需要让它工作,因为我将需要隐藏/显示其他项目在未来。

有办法吗?

谢谢!编辑:

我目前没有使用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>

我在bootstrap中像这样初始化它们。

$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'));
}

所以它现在像我想要的那样工作,但我仍然想把它做得更干净,所以如果你有任何建议来帮助我…

您应该看看http://www.zend.com/en/resources/webinars/framework上的"善用Zend_Navigator"网络研讨会。它解释了如何将导航绑定到特定的角色/ACL。

我用我使用的解决方案更新了我的问题,也许我会找到一个更好的方法来做到这一点,但现在这就是它。我在这里没有找到答案,所以我在回答我自己的问题。谢谢您的帮助!