4
votes

I have a problem with the EdpModuleLayouts module. I put Module.php in module/EdpModuleLayouts/ directory with the following content:

<?php
namespace EdpModuleLayouts;

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

I also registered it in the config/application.config.php:

return array(
'modules' => array(
    'EdpModuleLayouts',
    'Main',
    'Administrator',
    'Object'
),
'module_layouts' => array(
    'Main' => 'layout/main',
    'Administrator' => 'layout/admin',
),
'module_listener_options' => array(
    'module_paths' => array(
        './module',
    ),
    'config_glob_paths' => array(
        'config/autoload/{,*.}{global,local}.php',
    ),
),
);

The config ot the "main" module looks like:

<?php
return array(
'router' => array(
    'routes' => array(
        'Main' => array(
            'type' => 'Literal',
            'options' => array(
                'route' => '/main',
                'defaults' => array(
                    '__NAMESPACE__' => 'Main\Controller',
                    'controller' => 'Index',
                    'action' => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'default' => array(
                    'type' => 'Segment',
                    'options' => array(
                        'route' => '[/:controller][/:action][/:id]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'id' => '[0-9]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        ),
    ),
),
'service_manager' => array(
    'factories' => array(),
),
'controllers' => array(
    'invokables' => array(
        'Main\Controller\Index' => 'Main\Controller\EmailController',
        'Main\Controller\Error' => 'Main\Controller\ErrorController',
        'Main\Controller\FAQ' => 'Main\Controller\FAQController',
        'Main\Controller\Index' => 'Main\Controller\IndexController',
        'Main\Controller\Pages' => 'Main\Controller\PagesController',
        'Main\Controller\Settings' => 'Main\Controller\SettingsController',
        'Main\Controller\User' => 'Main\Controller\UserController',
    ),
),
'view_manager' => array(
    'template_map' => array(
        'layout/main' => __DIR__ . '/../view/layout/main_layout.phtml',
        'layout/header' => __DIR__ . '/../view/layout/main_header.phtml',
        'layout/footer' => __DIR__ . '/../view/layout/main_footer.phtml',
        'index/index' => __DIR__ . '/../view/index/index.phtml',
        'error/404' => __DIR__ . '/../view/error/404.phtml',
        'error/index' => __DIR__ . '/../view/error/index.phtml',
    ),
    'template_path_stack' => array(
        __DIR__ . '/../view',
    ),
    'display_exceptions' => true,
    'exception_template' => 'error/index',
    'display_not_found_reason' => true,
    'not_found_template' => 'error/404',
),
);

But when I access whatever module in the application I want, it throws an exception:

( ! ) Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'Zend\View\Renderer\PhpRenderer::render: Unable to render template "layout/layout"; resolver could not resolve to a file' in D:\WebServer\www\homepage\vendor\library\Zend\View\Renderer\PhpRenderer.php on line 461 ( ! ) Zend\View\Exception\RuntimeException: Zend\View\Renderer\PhpRenderer::render: Unable to render template "layout/layout"; resolver could not resolve to a file in D:\WebServer\www\homepage\vendor\library\Zend\View\Renderer\PhpRenderer.php on line 461

What's the reason?

3

3 Answers

5
votes

As a newcomer to ZF2, it took me a while to make EdpModuleLayouts module to work. The key is to configuring the "view_manager" and "template_map" settings. Please visit http://www.webtrafficexchange.com/zf2-configure-layout-each-module-edpmodulelayouts for configuration samples.

1
votes

All this is doing is setting the appropriate layout.

controller->layout($config['module_layouts'][$moduleNamespace]);

The error message is telling you that it was unable to find the template it is trying to set. You still need to configure your layouts in the template map. Here is an example from one of my projects.

'view_manager' => array(
    'template_map' => array(
        'cms-admin/admin/dashboard'  => __DIR__ . '/../view/cms-admin/admin/dashboard.phtml',
        'cms-admin/login/login'      => __DIR__ . '/../view/cms-admin/login/login.phtml',
        'cms-admin/users/index'      => __DIR__ . '/../view/cms-admin/admin/users/index.phtml'
    )
),

'module_layouts' => array(
    'CmsAdmin'   => 'layout/admin-layout',
),
-1
votes

Does the if (isset($config['module_layouts'][$moduleNamespace])) evaluates to true? I think that your option module_layouts should be in the config directory:

./config/layouts.config.glob.php:

<?php
    return array(
        'module_layouts' => array(
            'Main' => 'layout/main',
            'Administrator' => 'layout/admin',
        ),
    );
?>

Could you give that a try?