2013-03-03 87 views
2

我正在使用Zend导航ACL。我的用户可以有多个角色,但彼此之间没有任何关系,但Zend导航只接受一个角色,并检查具有该角色的ACL,这对我不利。ZF2注册导航定制助手

如何注册导航的新助手,以便我可以覆盖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', 
    ), 
), 

如何注册这个帮手,使导航知道吗?

+1

你应该添加用户的ACL与父母一起的角色,然后交给这个角色ID导航帮手。不需要定制助手。 – Crisp 2013-03-03 11:03:26

回答

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'); 
    } 
} 
+0

tnx男人它的工作 – Exlord 2013-03-03 11:00:41

4

即使话题是老了,该解决方案并没有为我在ZF2 v2.3.3工作。

经过一番研究,我发现Navigation Helper没有共享,或者它是混乱共享的树枝模块,如果我尝试在模块引导中添加自定义插件到Navigation(例如新菜单),它是无效的。但我在

发现了一个有趣的事情在阅读导航帮助建设

的Zend \导航\查看\ HelperConfig.php

导航插件管理器可以在模块,全局或本地配置来配置项下navigation_helpers。这是一种使用插件扩展导航的简单方法。

例:

module.config.php

'navigation_helpers' => array (
    'invokables' => array(
     'menu' => 'Application\View\Helper\Navigation\Menu', 
    ), 
),