2013-03-03 63 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', 
    ), 
),