2

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

如果我做一个

<?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 来控制权限,并且工作正常。我唯一的问题是我不想为客人显示前端/后端导航,因为只有一个链接项的导航非常无用。很抱歉造成混乱。

4

3 回答 3

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 必须设置为 Navigation Helper,以及当前用户的角色

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

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

其他资源:

于 2011-02-24T10:34:23.757 回答
0

你可以使用 Zend_ACL 这个
Zend_Navigation 可以使用它

于 2011-02-24T10:30:34.817 回答
0

您可以Zend_AclZend_Navigation. 看这里

于 2011-02-24T10:31:07.570 回答