在ZF2中我有一个带有更多控制器的模块,共享让菜单(用于在控制器之间导航)。 要在控制器之间共享此菜单,我必须将其放在每个控制器视图中:
<div class="span2">
<?php echo $this->partial('leftmenu'); ?>
</div>
<div class="span10">
THIS IS THE CONTROLLER VIEW
</div>
所以我到处重复<?php echo $this->partial('leftmenu'); ?>
代码。有没有办法只执行一次,并使其出现在控制器的所有视图中?
答案 0 :(得分:1)
一种方法是将ViewModel注入到布局中并将其渲染到那里。
Module.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');
}
您只需要在布局中渲染菜单..
layout.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);
答案 1 :(得分:0)
如果你必须根据某些条件改变部分,
您可以在Module中设置global,如果需要,可以从控制器中进行更改。
模块
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); ?>