2013-03-11 1 views
3

В каждом модуле в моем приложении у меня будет раздел основного контента и меню боковой панели.Zend Framework 2 два шаблона в одном макете?

В моем макете я следующее ...

<div id="main" class="span8 listings"> 
    <?php echo $this->content; ?> 
</div> 

<div id="sidebar" class="span4"> 
    <?php echo $this->sidebar; ?> 
</div> 

Мои контроллеры возвращают один ViewModel, который определяет содержание (см ниже), но как я могу заставить его также заполнить боковую панель?

public function detailsAction() 
{ 
    *some code to populate data* 

    $params = array('data' => $data);    

    $viewModel = new ViewModel($params); 
    $viewModel->setTemplate('school/school/details.phtml');  

    return $viewModel; 
} 

У меня такое чувство, что я делаю что-то принципиально неправильное здесь.

ответ

1

В контроллере можно использовать view models nesting и layout plugin:

public function fooAction() 
{ 
    // Sidebar content 
    $content = array(
     'name'  => 'John' 
     'lastname' => 'Doe' 
    ); 
    // Create a model for the sidebar 
    $sideBarModel = new Zend\View\Model\ViewModel($content); 
    // Set the sidebar template 
    $sideBarModel->setTemplate('my-module/my-controller/sidebar'); 

    // layout plugin returns the layout model instance 
    // First parameter must be a model instance 
    // and the second is the variable name you want to capture the content 
    $this->layout()->addChild($sideBarModel, 'sidebar'); 
    // ... 
} 

Теперь вы просто эхо переменной в скрипте макета :

<?php 
    // 'sidebar' here is the same passed as the second parameter to addChild() method 
    echo $this->sidebar; 
?> 
+0

Спасибо, Josias! Именно то, что мне нужно! – jonadams51

6

Вы можете включить «суб шаблоны» с помощью partial view helper

<div id="main" class="span8 listings"> 
    <?php echo $this->content; ?> 
</div> 

<div id="sidebar" class="span4"> 
    <?php echo $this->partial('sidebar.phtml', array('params' => $this->params)); ?> 
</div> 
+0

Thank you Bram. Тем не менее, это будет работать, боковая панель является общесистемной, но вышеприведенное решение будет работать только при добавлении к каждому конкретному виду. – jonadams51

+1

Частичная часть sidebar.phtml частично отображается в вашем макете, поэтому она является боковой. параметры являются конкретными действиями, но вам не нужно передавать эти параметры, если вам не нужно выполнять какую-либо конкретную логику действий на боковой панели. –

0

// Module.php добавить его is

use Zend\View\Model\ViewModel; 


public function onBootstrap($e) 
{ 
    $app = $e->getParam('application'); 
    $app->getEventManager()->attach('dispatch', array($this, 'setLayout')); 
} 

public function setLayout($e) 
{ 
    // IF only for this module 
    $matches = $e->getRouteMatch(); 
    $controller = $matches->getParam('controller'); 
    if (false === strpos($controller, __NAMESPACE__)) { 
     // not a controller from this module 
     return; 
    } 
    // END IF 

    // Set the layout template 
    $template = $e->getViewModel(); 
    $footer = new ViewModel(array('article' => "Dranzers")); 
    $footer->setTemplate('album/album/footer'); 
    $template->addChild($footer, 'sidebar'); 
} 
Смежные вопросы