View 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> 这是控制器视图 所以我到处重复代码。

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

<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); ?>