不同模块的不同布局

时间:2016-10-13 18:29:40

标签: php zend-framework zend-framework2

发生了一些非常奇怪的事情。我有两个模块,一个名为Application,另一个名为Dashboard,它们是不同的,彼此无关。我想对每一个使用phtml布局,这就是我所做的:

module/Application/config/module.config.php

// ...

'view_manager' => [
    'display_not_found_reason' => true,
    'display_exceptions'       => true,
    'doctype'                  => 'HTML5',
    'not_found_template'       => 'error/404',
    'exception_template'       => 'error/index',
    'template_map' => [
        'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
        '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' => [
        __DIR__ . '/../view',
    ],
],

module/Dashboard/config/module.config.php

// ...

'view_manager' => [
    'doctype'  => 'HTML5',
    'template_map' => [
        'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
        'dashboard/index/index'   => __DIR__ . '/../view/dashboard/index/index.phtml',
        'error/404'               => __DIR__ . '/../view/error/404.phtml',
        'error/index'             => __DIR__ . '/../view/error/index.phtml',
    ],
    'template_path_stack' => [
        __DIR__ . '/../view',
    ],
],

我创建了两个独立的布局,一个在module/Application/view/layout/layout.phtml,另一个在module/Dashboard/view/layout/layout.phtml,逻辑上它必须工作,但它不会,它总是调用Dashboard布局即使是Application。 我想知道,如何为每个模块使用单独的布局?

1 个答案:

答案 0 :(得分:1)

我在之前的ZF2项目中遇到了同样的问题。问题是你使用相同的布局/布局'两个模块的标识符,在配置合并期间,一个丢失。

我们的想法是为标识符指定不同的名称,并使用允许更改布局的抽象控制器。在dispatch事件中,您附加了一个函数,它将为您的模块设置布局:

Module.php (主要模块)

public function onBootstrap($e)
{
    $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController', 'dispatch', function($e) {
    $controller = $e->getTarget();
    $controllerClass = get_class($controller);
    $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));
    $controller->layout($moduleNamespace . '/layout');
    }, 100);
}  

使用不同布局的所有模块的 module.config.php (例如 Dashboard ):

'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(
        'Dashboard/layout'           => __DIR__ . '/../view/layout/layout.phtml',
        'Dashboard/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',
    ),
),

它应该没问题。此外,您还可以使用其他聚会代码,例如EdpModuleLayouts,但不再需要维护...我的解决方案的好处是您应该了解自己的所作所为。