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; ?>
至少,这就是如何结合多个控制器,
感谢提示,因此不同的布局,但它并没有真正回答我的追求离子 – kitensei 2014-10-03 13:03:36