0

我对 ZF2 中的菜单有疑问。

例如,我有一个模块和两个控制器。在布局中,我可以渲染菜单:

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

但我想根据当前控制器分别渲染它们,并且在布局中它必须是这样的:

$this->menu;

如何根据控制器将变量“菜单”注册为菜单。我试图在“onBootstrap”方法中做到这一点,但我失败了。


我是这样做的:

模块.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 方式是否正确?:)

4

2 回答 2

1

您必须通过扩展 DefaultNavigationFactory 创建第二个导航对象,正如 Jurian在此处解释的那样。

于 2013-04-24T12:17:48.693 回答
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 引导方法中,但您明白了。

您只针对模块命名空间中的调度事件,而不是附加到系统范围内的所有调度事件。

于 2013-04-24T13:58:11.083 回答