ZF2改变布局

问题描述:

我想根据我的路线改变布局,在这里我做了什么至今:ZF2改变布局

<?php namespace Application\Listener; 

use Zend\EventManager\AbstractListenerAggregate; 
use Zend\EventManager\EventManagerInterface; 
use Zend\Mvc\MvcEvent; 
use Zend\View\Model\ModelInterface as Model; 

class LayoutListener extends AbstractListenerAggregate 
{ 
    /** 
    * Attach one or more listeners 
    * Implementors may add an optional $priority argument; the EventManager 
    * implementation will pass this to the aggregate. 
    * @param EventManagerInterface $events 
    * @return void 
    */ 
    public function attach(EventManagerInterface $events) 
    { 
     $sharedEvents = $events->getSharedManager(); 
     $this->listeners[] = $sharedEvents->attach(
      'Zend\Mvc\Controller\AbstractController', 
      MvcEvent::EVENT_DISPATCH, 
      array($this, 'handleLayouts'), 
      -99); 
    } 

    public function handleLayouts(MvcEvent $event) 
    { 
     $viewModel = $event->getViewModel(); 
     if (!$viewModel instanceof Model) { 
      return; 
     } 

     $routeMatch = $event->getRouteMatch(); 
     $resolver = $event->getApplication() 
      ->getServiceManager() 
      ->get('Zend\View\Resolver\TemplatePathStack'); 

     if ('Application\Controller\Index' !== $routeMatch->getParam('controller')) { 
      return; 
     } 

     switch ($routeMatch->getParam('action')) { 
      case 'index': 
       $template = 'layout/layout'; 
       break; 
      case 'home': 
       $template = 'layout/home'; 
       break; 
      default: 
       $template = null; 
       break; 
     } 

     /** 
     * 
     * Don't know why, but to set a template must use $event->getViewModel() 
     * and for terminal must use $event->getResult(), otherwise it won't works 
     * 
     */ 

     // if template is resolvable, use it, otherwise go terminal 
     if ($template && $resolver->resolve($template)) { 
      $viewModel->setTemplate($template); 
     } else { 
      if ($event->getResult() instanceof Model) { 
       $event->getResult()->setTerminal(true); 
       $viewModel->setTerminal(true); 
      } 
     } 
    } 
} 

Module.php

public function onBootstrap(MvcEvent $e) 
{ 
    $translator = $e->getApplication()->getServiceManager()->get('translator'); 
    $translator->setLocale(\Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE'])) 
     ->setFallbackLocale('en_US'); 

    $eventManager = $e->getApplication()->getEventManager(); 
    $eventManager->attachAggregate(new LayoutListener()); 

    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 
} 

有一个事情我不明白,如果我想改变布局,我必须用

  • $event->getViewModel()->setTemplate($template);

否则将无法正常工作,如果我想设置视图模型终端,我必须用

  • $event->getResult()->setTerminal(true);

否则将无法正常工作,能有人解释我为什么?

我试图实现它的以下内容:我有一个索引模板,用于初始化加载任何其他路由内容的iFrame,因此在索引布局中,我设置了菜单和其他任何页面使用索引/索引时不需要布局。

现在我想有一个自定义布局(自定义显示),因此,根据路线上的子页面,我设置一个新的布局到视图模型。

您可以添加儿童观看您的视图模型(如果你在一个控制器) - 如果你做出自己的控制器为您的子视图(或子页面):

$view = new ViewModel(array(
    // parameters 
)); 

$view->addChild($this->forward()->dispatch('SubpageController', array(
    'action' => 'index', 
)), 'contentOfSubpage'); 

return $view; 
模板

,你可以访问SubpageController的内容是这样的:

<?php echo $contentOfSubpage; ?> 

至少,这就是如何结合多个控制器,

+0

感谢提示,因此不同的布局,但它并没有真正回答我的追求离子 – kitensei 2014-10-03 13:03:36