我想基于Zend_Acl使用Zend_Navigation进行导航 下面是我的navigation.xml文件的一部分,位于/ application / configs目录
<?xml version="1.0" encoding="UTF-8"?>
<config>
<nav>
<menu1>
<label>solidData</label>
<uri>#</uri>
<pages>
<service>
<label>menuLabel1</label>
<controller>service</controller>
<action>index</action>
<resource>service</resource>
<privilege>index</privilege>
</service>
<attendance>
<label>menuLabel2</label>
<controller>attendance</controller>
<action>index</action>
<resource>attendance</resource>
<privilege>index</privilege>
</attendance>
</pages>
</menu1>
<menu2>
<label>systemData</label>
<uri>#</uri>
<pages>
<users>
<label>users</label>
<controller>users</controller>
<action>index</action>
<resource>users</resource>
<privilege>index</privilege>
</users>
<profile>
<label>profiles</label>
<controller>profile</controller>
<action>index</action>
<resource>profile</resource>
<privilege>index</privilege>
</profile>
<dictionary>
<label>dictionary</label>
<controller>dictionary</controller>
<action>index</action>
<resource>dictionary</resource>
<privilege>index</privilege>
</dictionary>
<language>
<label>languages</label>
<controller>language</controller>
<action>index</action>
<resource>language</resource>
<privilege>index</privilege>
</language>
</pages>
</menu2>
</nav>
</config>
我不想在ACL中显示所有页面都拒绝的部分。
例如,如果有用户在ACL中有TYPE_DENY所有页面资源和<menu1>
的权限我不想创建并显示标签“solidData”
主要问题是我的菜单结构,因为你看到我在一个菜单部分有各种资源。
我尝试使用我自己的Navigation类扩展Zend_Navigation函数 isVisible()“和” isActive()“但我无法找到解决方案。
我会感激任何帮助
[edit]看看我菜单的这个片段结构:
<menu2>
<label>systemData</label>
<uri>#</uri>
<pages>
<users>
<label>users</label>
<controller>users</controller>
<action>index</action>
<resource>users</resource>
<privilege>index</privilege>
</users>
<profile>
<label>profiles</label>
<controller>profile</controller>
<action>index</action>
<resource>profile</resource>
<privilege>index</privilege>
</profile>
</pages>
</menu2>
我不能<resource>
到<menu2>
,因为<menu2>
包含具有不同资源f.e的页面。 '用户'和'个人资料'。
也许有可能在一个菜单中添加许多资源。我尝试这样的事情:
<menu2>
<label>systemData</label>
<uri>#</uri>
<resource>users</resource>
<resource>profile</resource>
<pages>
...
</pages>
</menu2>
但是我得到了
Invalid argument: $resource must be null, a string, or an instance of Zend_Acl_Resource_Interface
修改
好的,但如果我更改菜单结构,我还必须更改ACL。 在我的ACL资源中,Controller的权限是控制器中的Action。
答案 0 :(得分:1)
我不确定我是否理解正确,但为什么你没有<menu1>
中的资源并拒绝这些用户访问该资源,而不是其他资源?您可能必须更改ACL模式以捕获此类事件,但不能访问导航。
<强>更新强> 请尝试第二个问题:
<menu2>
<label>systemData</label>
<uri>#</uri>
<resource>systemData</resource>
<pages>
...
</pages>
</menu2>
资源只是一个标识符,因此您不应该(不能)将两个资源添加到一个对象。您不必担心导航中的访问逻辑,而是提供要使用的ACL的信息。当然,在ACL中,您可以添加更多逻辑,以便将权限分配给正确的资源。
答案 1 :(得分:0)
即。标记权限?可能?
$this->allow($guest, array('login', 'register'), array('view', 'guest:login', 'guest:register'));
$this->allow('user', array('logout', new Zfcms_Acl_Resource_News, 'content'), array('view', 'browse', 'latest', 'submit', 'save', 'editown', 'deleteown'));
$this->allow('admin', array('admin:area'), array('admin:view', 'admin:edit', 'admin:delete', 'admin:summary'));
$this->allow('admin');
$this->deny($guest, new Zfcms_Acl_Resource_News, array('save'));
/**
* The below prevents logged users from seeing the login/register tabs
*/
$this->deny(new Zfcms_Acl_Role_User(), null, array('guest:login', 'guest:register'));