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);

в противном случае это не будет работать, и если я хочу установить терминал viewModel, я должен использовать

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

иначе это не сработает, может кто-нибудь объяснить мне, почему?

Я пытаюсь добиться следующего: у меня есть один шаблон для индекса /, который инициализирует iFrame, загружающий содержимое любого другого маршрута, поэтому в макете индекса я настроил меню, и любые другие страницы не нужны иметь макет, так как используется индекс / единица.

Теперь мне нужна подстраница, имеющая пользовательский макет (настраиваемое отображение), поэтому на основе маршрута я установил новый макет для модели представления.

0

Решение

Вы можете добавить дочерние представления к своей модели представления (если вы находитесь в Контроллере) — если вы делаете собственный контроллер для своего подпредставления (или подстраницы):

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

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

return $view;

в шаблоне вы можете получить доступ к содержимому SubpageController следующим образом:

<?php echo $contentOfSubpage; ?>

по крайней мере, так вы можете комбинировать несколько контроллеров, поэтому разные макеты

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]