2013-04-18 142 views
0

在ZF2中,我有一个带有更多控制器的模块,这个模块共享这个菜单(用于控制器之间的导航)。 要共享控制器我必须把这个在每个控制器视图之间菜单: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

如果它意味着无论控制器动作的展示,把它的布局呢? – Crisp

+0

我无法放入布局,因为布局是在所有模块和模块之间共享不同的控制器。我应该分开为这个模块定义一个布局吗? – albanx

+0

如果只有一个模块是很常见的,是的,模块特定的布局将成为 – Crisp

回答

1

一种方法是将视图模型注入到您的布局并将其渲染到那里。

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

如果你必须根据一些条件改变部分ex。

  • 侧导航布局鉴于
  • 侧导航...

您可以从控制器设置在模块中的全局,如果necesary改变它。

模块

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); ?> 
相关问题