Zend Navigation&递归Zend Acl

时间:2011-07-19 13:04:16

标签: php zend-framework zend-navigation zend-acl

我想基于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。

2 个答案:

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