0

在 ZF2 中,我有一个带有更多控制器的模块,它共享菜单(用于在控制器之间导航)。要在控制器之间共享此菜单,我必须将其放在每个控制器视图中:

<div class="span2">
<?php echo $this->partial('leftmenu'); ?>
</div>

<div class="span10">
THIS IS THE CONTROLLER VIEW
</div>

所以我<?php echo $this->partial('leftmenu'); ?>到处重复代码。有没有办法只做一次并让它出现在控制器的所有视图中?

4

2 回答 2

1

一种方法是将 ViewModel 注入您的布局并在其中呈现。

模块.php

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

    $viewModel = $e->getViewModel();
    $menu = new ViewModel();
    $menu ->setTemplate('module/menu/something');
    $viewModel->addChild($menu, 'menu');
}

然后,您只需要在布局内呈现菜单..

布局.phtml

<?php if(isset($menu)) echo $menu ?>

如果您想要不同的效果,您也可以附加到不同的事件上,例如,如果您在某个模块中,则只注入模块,或者注入任何扩展抽象控制器的控制器:

// Bootstrap ///

$e->getApplication()->getEventManager()->getSharedManager()
        ->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
    $controller = $e->getTarget();
    $controllerClass = get_class($controller);
    $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));

    // logic to decide what you want

    $viewModel = $e->getViewModel();
    $menu = new ViewModel();
    $menu ->setTemplate('module/menu/something');
    $viewModel->addChild($menu, 'menu');
}, 100);
于 2013-04-18T15:22:00.220 回答
0

如果您必须根据某些条件更改部分,例如。

  • 布局中的侧导航
  • 侧面导航在视图中...

您可以在模块中设置全局,如果需要,可以从控制器中更改它。

模块

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);

    $eventManager->attach('dispatch', array($this, 'loadViewVars'), 100);
    // 100-gives access for controller to overwrite this var
    // 1-prevents overwriting
}

public function loadViewVars(MvcEvent $e)
{
    $e->getViewModel()->setVariables(
        array('sideNavigation'=>'partial/sidenavigation_1.phtml',)
    );
}

控制器

//you can change in some controller by
$this->layout()->sideNavigation='partial/sidenavigation_2.phtml';

看法

<?php echo $this->partial($this->layout()->sideNavigation); ?>
于 2013-07-01T00:45:01.810 回答