Запретить Layout в выбранном Модуле

Для примера, нам нужен модуль предоставляющий только контент 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *