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

时间:2011-09-09 18:32:13

标签: php zend-framework menu menuitem

[见最后的更新]

我正在使用Zend框架,在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>

我在这样的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'));
}

所以它现在就像我想要的那样,但是我仍然想要做得更清洁,所以如果你有任何建议可以帮助我......谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我用我使用的解决方案更新了我的问题,也许我会找到一个更好的方法,以后再做,但现在就是这样。我没有在这里找到解决方案,这就是我回答自己问题的原因。谢谢你的帮助!