Php ZF2不同控制器中的不同菜单
我有一个关于ZF2中菜单的问题 例如,我有一个模块和两个控制器。在布局中,我可以渲染菜单:Php ZF2不同控制器中的不同菜单,php,zend-framework,menu,navigation,zend-framework2,Php,Zend Framework,Menu,Navigation,Zend Framework2,我有一个关于ZF2中菜单的问题 例如,我有一个模块和两个控制器。在布局中,我可以渲染菜单: <?php echo $this->navigation()->menu('mainMenu'); ?> <?php echo $this->navigation()->menu('settingsMenu'); ?> 如何根据控制器将变量“menu”注册为菜单。 我试着用“onBootstrap”的方法来做,但失败了 我是这样做的: Module.ph
<?php echo $this->navigation()->menu('mainMenu'); ?>
<?php echo $this->navigation()->menu('settingsMenu'); ?>
如何根据控制器将变量“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方面是否正确?:) 正如Jurian所解释的,您必须通过扩展DefaultNavigationFactory来创建第二个导航对象。您可以使用共享事件管理器针对特定名称空间的事件,从而分别针对您的模块
/**
* 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.php引导方法中,但您已经明白了
您只针对模块命名空间中的调度事件,而不是附加到系统范围内的所有调度事件。我已经在ServiceManager中注册了两个对象:“mainMenu”和“settingsMenu”。但我不明白如何在视图中注册“菜单”,以包含所需的菜单,具体取决于控制器。
/**
* 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);
}