2013-04-24 28 views
0

我對ZF2中的菜單有疑問。ZF2不同控制器中的不同菜單

我有一個模塊,和兩個控制器,例如。在佈局我可以使菜單:

<?php echo $this->navigation()->menu('mainMenu'); ?> 
<?php echo $this->navigation()->menu('settingsMenu'); ?> 

但我想使它們分別取決於電流控制器和佈局必須是這樣的:

$this->menu; 

如何註冊變量「菜單「作爲取決於控制器的菜單。 我試圖用「onBootstrap」方法來做,但我失敗了。


我就是這麼做的:

Module.php:

public function onBootstrap(MvcEvent $e) 
{ 
    $e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_DISPATCH, array($this, 'headMenuAttach')); 
} 

public function headMenuAttach(MvcEvent $e) 
{ 
    $controller = $e->getTarget(); 

    if (method_exists($controller, 'getHeadMenu')) { 
     $menu = $controller->getHeadMenu(); 
     $controller->layout()->setVariable('MainMenu', $menu); 
    } 
} 

佈局:

$this->navigation()->menu($this->MainMenu); 

控制器:

public function getHeadMenu() 
{ 
    return 'settingsMenu'; 
} 

ZF2方式正確嗎? :)

回答

1

你必須通過擴展DefaultNavigationFactory創建第二個導航對象,如Jurian作了解釋here

+0

我已經有兩個對象:'mainMenu'和'settingsMenu'在ServiceManager中註冊。但我無法理解如何在視圖中註冊「菜單」以根據控制器包含所需的菜單。 – dima 2013-04-24 12:44:53

0

您可以使用共享的事件管理爲目標的具體命名空間的事件,爲此單獨定位模塊。

/** 
* On bootstrap event 
* 
* @param \Zend\Mvc\MvcEvent $e 
*/ 
public function onBootstrap(MvcEvent $e) 
{ 
    // .. other stuff here // 

    /** 
    * Only in our application namespace 
    * Put this part inside Application Modules Module.php 
    */ 
    $e->getApplication()->getEventManager()->getSharedManager() 
     ->attach('Application', 'dispatch', function($e) { 
     $controller = $e->getTarget(); 
     $controllerClass = get_class($controller); 
     $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\')); 

     // Attach Nav 1 here 
     if (method_exists($controller, 'getHeadMenu')) { 
      $menu = $controller->getHeadMenu(); 
      $controller->layout()->setVariable('MainMenu', $menu); 
     } 

    }, 100); 

    /** 
    * Only in our MyModule namespace 
    * Put this part inside MyModule Modules Module.php 
    */ 
    $e->getApplication()->getEventManager()->getSharedManager() 
     ->attach('MyModule', 'dispatch', function($e) { 

     // Attach Nav 2 here 

    }, 100); 
} 

你會想把每個條目放在它自己的Module Module.php bootstrap方法中,但你明白了。

您只針對調度事件在你的模塊命名空間,而不是連接到所有調度事件系統範圍。

相關問題