View ZF2在同一模块的控制器之间共享部分视图(菜单)
在ZF2中,我有一个带有更多控制器的模块,它共享菜单(用于在控制器之间导航)。 要在控制器之间共享此菜单,我必须将其置于每个控制器视图中:View ZF2在同一模块的控制器之间共享部分视图(菜单),view,controller,zend-framework2,View,Controller,Zend Framework2,在ZF2中,我有一个带有更多控制器的模块,它共享菜单(用于在控制器之间导航)。 要在控制器之间共享此菜单,我必须将其置于每个控制器视图中: <div class="span2"> <?php echo $this->partial('leftmenu'); ?> </div> <div class="span10"> THIS IS THE CONTROLLER VIEW </div> 这是控制器视图 所以我到处重复代码。
<div class="span2">
<?php echo $this->partial('leftmenu'); ?>
</div>
<div class="span10">
THIS IS THE CONTROLLER VIEW
</div>
这是控制器视图
所以我到处重复
代码。是否有一种方法可以只执行一次并使其显示在控制器的所有视图中?一种方法是将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 ?>
如果您必须根据某些条件更改partials,例如
- 布局中的侧导航
- 视野中的侧导航
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';
看法
如果要显示而不考虑控制器操作,请将其放在布局中?我无法放在布局中,因为布局在所有模块之间共享,并且模块具有不同的控制器。我应该为这个模块单独定义一个布局吗?如果它只对一个模块通用,是的,一个模块特定的布局将是goyes的方法。它只对一个模块通用。我可以做一个特定于模块的布局,但我需要共享(为了不重复代码)主布局的部分。。。。我将研究更多我会选择此模块的替代布局,或者选择仅当给定模块名称与路由匹配时才显示菜单的ViewHelper。
//you can change in some controller by
$this->layout()->sideNavigation='partial/sidenavigation_2.phtml';
<?php echo $this->partial($this->layout()->sideNavigation); ?>