2013-04-18 2 views
0

В ZF2 У меня есть модуль с большим количеством контроллеров, которые позволяют использовать меню (для навигации по контроллерам betwen). Чтобы поделиться этим меню между контроллерами, которые я должен поставить это в каждом виде контроллера:ZF2 Доля частичного просмотра (меню) betwen контроллеров того же модуля

<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

Один из способов включить инсталляцию 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); 
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); ?> 
Смежные вопросы