Для примера, нам нужен модуль предоставляющий только контент Ajax, и не нужен слой(макет) во всех действиях. Мы можем сделать трюк, сократив в каждом контролере/действии избыточный код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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); } }); } } |
Как сделать для всех модулей? Присоединяемся к событию dispatch контента Zend\Mvc\Controller\AbstractActionController:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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); } }); } } |
Теперь чуть другой пример, как переключить слой (макет).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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); } } |
Ещё один пример загрузки Layout из конфигов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } } |
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