2013-04-24 2 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-way? :)

ответ

1

Вам необходимо создать второй объект навигации, расширив DefaultNavigationFactory, поскольку Jurian объясняет here.

+0

У меня уже есть два объекта: 'mainMenu' и 'settingsMenu', зарегистрированные в ServiceManager. Но я не могу понять, как я могу зарегистрировать «меню» в представлении, чтобы содержать нужное мне меню в зависимости от контроллера. – dima

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.php, но вы получите идею.

Вы направляете только события отправки в пространстве имен модулей, а не привязываетесь ко всем событиям рассылки в системе.