0

Zend_Acl に基づいて Zend_Navigation でナビゲーションを作成したいと思います。以下は、/application/configs ディレクトリにある私の navigation.xml ファイルの一部です。

<?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」を作成して表示したくないという権限を持つユーザーがいるとします。

ご覧のとおり、1 つのメニュー セクションにさまざまなリソースがあるため、主な問題はメニューの構造です。

関数isVisible() " および " isActive() " を使用して Zend_Navigation を拡張する独自の Navigation クラスを試しましたが、解決策が見つかりません。

どんな助けにも感謝します

[編集] 私のメニューのこのフラグメント構造を見てください:

<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>1 つのメニューに多くのリソースを追加する可能性があるかもしれません。私はそのようなことを試みます:

<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 が Controller であり、権限は Controller の Action です。

4

2 に答える 2

1

私が正しく理解しているかどうかはわかりませんが、リソースを持っていて、<menu1>これらのユーザーが他のユーザーの代わりに、または追加でそのリソースへのアクセスを拒否しないのはなぜですか? このようなイベントをキャッチするには、ACL スキーマを変更する必要がありますが、ナビゲーションは変更しないでください。

更新 2番目の質問でこれを試してください:

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

リソースは単なる識別子であるため、2 つのリソースを 1 つのオブジェクトに追加しないでください (できません)。ナビゲーションのアクセス ロジックについて心配する必要はありませんが、ACL が操作するための情報を提供します。もちろん、ACL では、適切なリソースに特権を割り当てることができるように、さらにロジックを追加する必要があります。

于 2011-07-19T14:59:01.307 に答える
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'));
于 2011-07-22T21:01:09.787 に答える