ZF2在同一模块的控制器之间共享局部视图(菜单)

时间:2013-04-18 13:19:29

标签: view controller zend-framework2

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

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

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

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

2 个答案:

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