我对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方式是否正确? :)
答案 0 :(得分:1)
你必须通过扩展DefaultNavigationFactory来创建第二个导航对象,正如Jurian解释here。
答案 1 :(得分: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);
}
您可能希望将每个条目放在它自己的Modules Module.php引导方法中,但是您明白了。
您只定位模块命名空间中的Dispatch事件,而不是附加到系统范围内的所有调度事件。