jgx*_*xvx 2 php acl zend-framework zend-navigation
我有一个Zend_Navigation运行与navigation.xml文件提供的数据.我们假设第一级(0)由两个页面组成,前端和后端.guest用户可以通过admin角色访问前端,Backend只能访问前端.
如果我做了
<?php echo $this->navigation()->menu()->setMaxDepth(0); ?>
Run Code Online (Sandbox Code Playgroud)
它在未登录时正确显示"前端"链接,以管理员身份登录时显示"前端"和"后端"链接.
但是,显示"前端"链接对于访客来说没有多大意义,因为他们无论如何都没有任何其他页面可以导航到该级别.所以我宁愿不为客人显示导航.
我知道我能做到
<?php
if ('guest' !== $this->view->role) {
echo $this->navigation()->menu();
}
?>
Run Code Online (Sandbox Code Playgroud)
但我希望有更好的方法来做到这一点.
我正在寻找的是类似的东西
<?php
if (count($this->navigation()->getPagesForRole($this->view->role)) > 1) {
echo $this->navigation()->menu();
}
?>
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何使用Zend_Navigation提供的API实现这一点...我看到有一个getPages()方法,但它返回所有页面"未过滤".
我认为这有一个简单的解决方案,但我一直试图在过去的两个小时内解决这个问题并且什么都没找到,所以我猜我的方向错了.
谢谢你的时间.
编辑:
我忘了提到导航已经使用ACL来控制权限,它工作正常.我唯一的问题是我不想为客人显示前端/后端导航,因为只导航一个链接项是没用的.对此感到抱歉.
Zend Navigation需要一个Zend_Acl实例来实现它.您必须调整导航配置以包含资源/权限信息,例如
$navArray = array(
…,
array(
'module' => 'admin',
'label' => 'Administration',
'resource' => 'admin',
'privilege' => 'index',
'pages' => array(
…
);
Run Code Online (Sandbox Code Playgroud)
见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'));
…
Run Code Online (Sandbox Code Playgroud)
见http://framework.zend.com/manual/en/zend.acl.introduction.html
必须将ACL设置为Navigation Helper以及当前用户的角色
$this->getHelper('Navigation')
->setAcl($acl)
->setRole('user');
Run Code Online (Sandbox Code Playgroud)
之后,对Helper API的任何调用都应该知道ACL.在上面的示例中,如果用户不允许在ACL中访问它,则不应呈现管理菜单.
其他资源:
| 归档时间: |
|
| 查看次数: |
1926 次 |
| 最近记录: |