Zend_Navigation:仅获取当前用户/角色可访问的页面

时间:2011-02-24 10:07:18

标签: php zend-framework acl zend-navigation

我有一个Zend_Navigation运行,其中包含由navigation.xml文件提供的数据。我们假设第一级(0)由两个页面组成,前端和后端。 guest用户角色只能由管理员角色访问后端。

如果我做了

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

未正确登录时会正确显示“前端”链接,以管理员身份登录时会显示“前端”和“后端”链接。

然而,显示“前端”链接对于访客来说没有多大意义,因为他们无论如何都没有任何其他页面可以导航到该级别。所以我宁愿不为客人显示导航。

我知道我能做到

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

但我希望有更好的方法来做到这一点。

我正在寻找的是像

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

我无法弄清楚如何使用Zend_Navigation提供的API实现这一点...我看到有一个getPages()方法,但它返回所有页面“未过滤”。

我认为这有一个简单的解决方案,但我一直试图在过去的两个小时内解决这个问题并且什么也没找到,所以我想我的方向是错误的。

感谢您的时间。

修改

我忘了提到导航已经使用ACL来控制权限,而且它工作正常。我唯一的问题是我不想为客人显示前端/后端导航,因为只导航一个链接项是没用的。 对此感到抱歉。

3 个答案:

答案 0 :(得分:5)

Zend Navigation需要一个Zend_Acl实例来实现这一点。您必须调整导航配置以包含资源/权限信息,例如

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

之后,对Helper API的任何调用都应该知道ACL。在上面的示例中,如果在ACL中禁止用户访问它,则不应呈现管理菜单。

其他资源:

答案 1 :(得分:0)

您可以使用Zend_ACL Zend_Navigation可以使用它

答案 2 :(得分:0)

您可以将Zend_AclZend_Navigation进行整合。看here