2011-02-24 128 views
2

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

如果我做了

<?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来控制的权限,它的正常工作。我唯一的问题是,我不想为来宾显示前端/后端导航,因为只导航一个链接项目是没用的。 对此感到抱歉。

回答

0

您可以使用Zend_Acl里这个
Zend_Navigation可以用它

0

工作,你可以用Zend_Navigation整合Zend_Acl。看here

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

之后的角色一起,在助手API的调用应该是意识到ACL。在上面的示例中,如果在ACL中不允许用户访问管理菜单,则不应呈现管理菜单。

其他资源:

+0

感谢您详细的解答。我忘了提及我已经在使用Zend_Acl,而且工作正常。对于那个很抱歉。 – jgxvx 2011-02-24 11:18:00

+0

@ jgxvx只是确保客人没有访问权限,然后导航中的任何项目。 – Gordon 2011-02-24 11:54:23