2

ACLでZend Navigationを使用しています。ユーザーは相互に関係のない複数のロールを持つことができますが、Zend Navigationは 1 つのロールしか受け入れず、そのロールでACLをチェックしますが、これは私にとっては良くありません。

acceptAclメソッドをオーバーライドできるように、ナビゲーション用の新しいヘルパーを登録するにはどうすればよいですか。シンプルなビュー ヘルパーを作成して登録しようとしましたが、うまくいきませんでした

class Menu extends \Zend\View\Helper\Navigation\Menu implements \Zend\ServiceManager\ServiceLocatorAwareInterface
{

    protected function acceptAcl(AbstractPage $page)
    {
        if (!$acl = $this->getAcl()) {
            // no acl registered means don't use acl
            return true;
        }

        $userIdentity = $this->getServiceLocator()->get('user_identity');
        $resource = $page->getResource();
        $privilege = $page->getPrivilege();

        $allowed = true;
        if ($userIdentity->id !== "1") {

            if ($acl->hasResource($resource)) {
                $allowed = false;
                foreach ($userIdentity->rolls as $roll) {
                    if ($acl->isAllowed($roll['id'], $resource)) {
                        $allowed = true;
                        continue;
                    }
                }
            }
        }

        return $allowed;
    }

    public function renderMenu($container = null, array $options = array())
    {
        return 'this is my menu';
    }

}

'view_helpers' => array(
    'invokables' => array(
        'myMenu' => 'Application\View\Helper\Menu',
    ),
),

ナビゲーションがそれを認識できるように、このヘルパーを登録するにはどうすればよいですか?

4

3 に答える 3

3

Navigationビュー ヘルパーは に登録されますViewHelperPluginManager。すべてのナビゲーション ヘルパー (など) はMenuBreadcrumbs別のプラグイン マネージャーによって管理されます。私の知る限り、まだ構成内のナビゲーション ヘルパーを上書きすることはできません。

以下を に追加してみてくださいModule.php:

class Module
{
    public function onBootstrap($e)
    {
        $application = $e->getApplication();
        /** @var $serviceManager \Zend\ServiceManager\ServiceManager */
        $serviceManager = $application->getServiceManager();

        $pm = $serviceManager->get('ViewHelperManager')->get('Navigation')->getPluginManager();
        $pm->setInvokableClass('myMenu', '\Application\View\Helper\Menu');
    }
}
于 2013-03-03T10:19:03.413 に答える