Для примера, нам нужен модуль предоставляющий только контент Ajax, и не нужен слой(макет) во всех действиях. Мы можем сделать трюк, сократив в каждом контролере/действии избыточный код.
[cc lang=»php»]
namespace YourModule;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap(MvcEvent $e)
{
$sharedEvents = $e->getApplication()->getEventManager()->getSharedManager();
$sharedEvents->attach(__NAMESPACE__, ‘dispatch’, function($e) {
$result = $e->getResult();
if ($result instanceof \Zend\View\Model\ViewModel) {
$result->setTerminal($e->getRequest()->isXmlHttpRequest());
//if you want no matter request is, the layout is disabled, you can
//set true : $result->setTerminal(true);
}
});
}
}
[/cc]
Как сделать для всех модулей? Присоединяемся к событию dispatch контента Zend\Mvc\Controller\AbstractActionController:
[cc lang=»php»]
namespace YourModule;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap(MvcEvent $e)
{
$sharedEvents = $e->getApplication()->getEventManager()->getSharedManager();
$sharedEvents->attach(‘Zend\Mvc\Controller\AbstractActionController’,’dispatch’,
function($e) {
$result = $e->getResult();
if ($result instanceof \Zend\View\Model\ViewModel) {
$result->setTerminal($e->getRequest()->isXmlHttpRequest());
//if you want no matter request is, the layout is disabled, you can
//set true : $result->setTerminal(true);
}
});
}
}
[/cc]
Теперь чуть другой пример, как переключить слой (макет).
[cc lang=»php»]
<?php
namespace MyModule;
use Zend\ModuleManager\ModuleManager;
class Module
{
public function init(ModuleManager $moduleManager)
{
$sharedEvents = $moduleManager->getEventManager()->getSharedManager();
$sharedEvents->attach(__NAMESPACE__, ‘dispatch’, function($e) {
// This event will only be fired when an ActionController under the MyModule namespace is dispatched.
$controller = $e->getTarget();
$controller->layout(‘layout/alternativelayout’);
}, 100);
}
}
[/cc]
Ещё один пример загрузки Layout из конфигов:
[cc lang=»php»]
namespace SampleModuleLayouts;
class Module
{
public function onBootstrap($e)
{
$e->getApplication()->getEventManager()->getSharedManager()->attach(‘Zend\Mvc\Controller\AbstractActionController’, ‘dispatch’, function($e) {
$controller = $e->getTarget();
$controllerClass = get_class($controller);
$moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, ‘\\’));
$config = $e->getApplication()->getServiceManager()->get(‘config’);
if (isset($config[‘module_layouts’][$moduleNamespace])) {
$controller->layout($config[‘module_layouts’][$moduleNamespace]);
}
}, 100);
}
}
[/cc]
1) http://samsonasik.wordpress.com/2012/12/02/zend-framework-2-disable-layout-in-specific-module/
2) http://blog.evan.pro/module-specific-layouts-in-zend-framework-2