Use differents layouts to differents modules zend framework 2

layout, zend-framework2

Solution

I am also using EdpModuleLayouts for my multi-layout project. I think, you need to move module_layouts from module.config.php to autoload/global.php file.

This is my Module.php of the Application module :

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $eventManager->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);
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

This is my config\autoload\global.php :

return array(
   'db' => array(
       .........
   ),
   'service_manager' => array(
       ...........
   ),
   'module_layouts' => array(
       'Application' => 'layout/layout.phtml',
       'MyModuleName' => 'layout/mymodulename.phtml',
   ),
);

it works for me and hope it helps you.

Problem

I am using EdpModuleLayouts to use one layout to mobile version of my zf2 webapp and another to the "desktop" version. The configuration in module.config.php in Application module: ``` ...'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( 'module_layouts' => array( 'Application' => 'layout/application', 'User' => 'layout/user', ), 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), 'template_path_stack' => array( __DIR__ . '/../view', ), ), ``` Module.php of the Application module it's like this: ``` public function onBootstrap(MvcEvent $e) { $e->getApplication()->getServiceManager()->get('translator'); $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); $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]); echo $config['module_layouts'][$moduleNamespace]; } }, 100); } ``` Finally, I have one layout in Application module and another in User module. At this moment every time render the layout in the User Model, even though I enter the Application url. I stucked on this, I appreciate some help.

Original source