2013-04-18 166 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); ?> 
相關問題