2013-06-27 4 views
2

Редактирование оригинального сообщения, чтобы быть более четким. Теперь есть новая область проблем, которую я считаю чистым синтаксисом.ZF2 Partial ViewHelper

Я новичок в OOP и Zend Framework 2. Попытка понять использование партитур. Я также распространяю приложение, которое сначала запускает кто-то другой. Таким образом, соглашение об именах Entity/Gateway/Controller/View гарантирует, что для указанного действия возвращается правильный шаблон.

Я пытаюсь использовать "partial ('/ nav/index.phtml');" как способ вставки одного фрагмента в заголовок на индексной странице. Но я хочу использовать другое частичное на других страницах.

По предложению Маршалла, в TemplateController, я добавляю переменную (nav_template) с указанием ViewModel, которая частичного использования для навигации:

<?php 

    namespace Application\Controller; 

    use Zend\Mvc\Controller\AbstractActionController; 
    use Zend\View\Model\ViewModel; 

    class TplController extends AbstractActionController 
    { 
     public function topicAviewAction() 
     { 
      $viewModel = new ViewModel(); 
      $viewModel->setTerminal(true); 
     $viewModel->setVariable('nav_template', 'nav/topica.phtml'); 
      return $viewModel; 
     } 

     public function topicBviewAction() 
     { 
      $viewModel = new ViewModel(); 
      $viewModel->setTerminal(true); 
     $viewModel->setVariable('nav_template', 'nav/topicb.phtml'); 
      return $viewModel; 
     } 
    } 

Я использовал следующую команду, чтобы убедиться, что моя переменная была включаются в объекте, который он был

echo $viewModel->nav_template; 

Однако, когда я иду, чтобы включить частичный в layout.phtml, используя следующее:

<?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?> 

Очевидно, что не используется/не найдено значение $ nav_template. Где я неправ?

+0

Это потому, что вы устанавливаете переменную в скрипте вида, а не макет. См. Мой ответ еще раз и внимательно посмотрите на то, что переменной присваивается: '$ this-> layout() -> setVariable (' –

+0

Кроме того, вы не собираетесь, чтобы ваш макет отображался вообще, если вы используете 'setTerminal (true)' - который отключает макет –

+0

Вот полезное сообщение в блоге от Роба Аллена о доступе к переменным viw в другой модели просмотра: http://akrabat.com/zend-framework-2/access-view-variables-in -another-view-model/ – dualmon

ответ

2

Вы можете использовать событие onBootstrap в своем классе модуля. Не забудьте обработать его в событии маршрута, иначе у вас не будет маршрутной метки еще в тот момент в onBootstrap. Пример:

public function onBootstrap(MvcEvent $e) 
    { 
     $e->getApplication()->getEventManager()->attach(
       \Zend\Mvc\MvcEvent::EVENT_ROUTE, 
       function($e) { 
        $viewModel = $e->getViewModel(); 
        $nav = new \Zend\View\Model\ViewModel(); 
        $routeMatch = $e->getRouteMatch(); 
        switch ($routeMatch->getMatchedRouteName()) 
        { 
         case 'home': 
          $template = 'your/template'; 
          break; 

         default: 
          break; 
        } 
        $nav->setTemplate($template); 
        $viewModel->addChild($nav, 'nav'); 
       }, 
       -1000 
     ); 
     ... 

В вашем макете вы можете просто использовать: echo $ nav;

Обратите внимание, что вы также должны определить шаблоны, которые вы используете здесь, в файле module.config.php в ключе 'view_manager' => 'template_map'.

+0

Спасибо за подробное предложение Ruben. Мой первый шаг в ZF2 расширяет то, что сначала написано кем-то более узнаваемым. Диспетчер представлений указывает индекс приложения, но все остальные шаблоны вызывают через шаблон контроллер, когда вызывается соответствующее действие.Я считаю, что мне нужно обрабатывать это в контроллере. – manisha

+0

Нет проблем. Я не уверен, что понимаю архитектуру, которую вы описываете. Вы говорите, что все запросы являются rou к шаблону, который определяет, какой шаблон использовать? Если это так, то это очень странный способ справиться с вещами. – Ruben

+0

Я получил это для работы. Благодаря! – manisha

0

В шаблоне макета, называют динамическую парциальным с запасным вариантом по умолчанию, как это:

<?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?> 

Затем в контроллере, где вы хотите изменить макет СЧ:

$this->layout()->setVariable('nav_template', 'nav/other'); 

должен работать. (Непроверенный)

+0

Ok. Я считаю, что это должно работать, но что-то не так с моим синтаксисом. Я буду обновлять исходный пост. – manisha

0

FWIW, хорошая работа, Ruben, но если вы используете настройки маршрутизации по умолчанию (например, из скелетов App), он всегда будет возвращать что-то вроде 'application\default' при использовании $routeMatch->getMatchedRouteName()

Вот небольшие моды который будет работать с регулярными выражениями сегмента маршрутами:

public function onBootstrap(MvcEvent $e) 
{ 
    $e->getApplication()->getEventManager()->attach(
      \Zend\Mvc\MvcEvent::EVENT_ROUTE, 
      function($e) { 
       $viewModel = $e->getViewModel(); 
       $nav = new \Zend\View\Model\ViewModel(); 
       $routeMatch = $e->getRouteMatch(); 
       $routeMatchParams = $routeMatch->getParams(); // <-- added this 

       switch ($routeMatchParams['controller']) // // <-- switch on invokable alias of your controller(s) 
       { 
        case 'Application\Controller\YourController': 
         $template = 'your/custom-template'; 
         break; 

        default: 
         $template = 'your/default-template'; 
         break; 

       } 

       $nav->setTemplate($template); 
       $viewModel->addChild($nav, 'nav'); 
      }, 
      -1000 
    ); 
    ... 
0

Проще говоря, я думаю, что все, что вам нужно сделать, это использовать ...

$this->nav_template 

вместо ...

$nav_template 

Другие рамки делать вещи по-разному, но в ZF2 переменные устанавливаются в самой ViewModel, таким образом, может быть вызвана из макетов/взглядов, используя магический метод получения и хватая его из переменной $ данных в пределах Просмотр/просмотр класса модели.

Точка существо ...

Использование ...

$this->nav_template