Zend Navigation & рекурсивный Zend Acl - PullRequest
0 голосов
/ 19 июля 2011

Я хотел бы сделать навигацию с Zend_Navigation на основе Zend_Acl ниже приведен фрагмент моего файла navigation.xml, расположенный в / application / configs dir

<?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.

Например, если есть пользователь, у которого TYPE_DENY в ACL для ресурса всех страниц и привилегия <menu1> Я не хочу создавать и отображать метку "solidData"

Основная проблема - структура моего меню, потому что, как вы видите, у меня есть разные ресурсы в одном разделе меню.

Я пробовал с моим собственным классом Navigation, расширяющим Zend_Navigation с помощью функций isVisible ()"и" isActive ()", но я не могу найти решение.

Буду благодарен за любую помощь

[править] Посмотрите на эту структуру фрагмента моего меню:

<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> включают страницы с различными ресурсами, например «пользователи» и «профиль». возможно есть возможность добавить много ресурсов в одно меню. Я пытаюсь что-то подобное:

<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

EDIT

Хорошо, но если я изменю структуру меню, мне также придется изменить ACL. В моем ACL-ресурсе Controller привилегия называется Action in contoller.

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Я не уверен, что правильно понимаю, но почему у вас нет ресурса в <menu1> и вы отказываете этим пользователям в доступе к этому ресурсу вместо этого или дополнительно к другим? Возможно, вам придется внести изменения в схему ACL, чтобы перехватывать такие события, но не в навигацию.

UPDATE Попробуйте ответить на второй вопрос:

<menu2>
    <label>systemData</label>
    <uri>#</uri>
    <resource>systemData</resource>
    <pages>
        ...
    </pages>
</menu2>

Ресурс - это просто идентификатор, поэтому вы не должны (не можете) добавлять два ресурса к одному объекту. Вам не нужно беспокоиться о логике доступа в навигации, но предоставьте информацию для работы с ACL. В вашем ACL вы, конечно, должны добавить больше логики, чтобы вы могли назначить привилегию нужному ресурсу.

0 голосов
/ 23 июля 2011

т.е. пометить привилегию?может быть?

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