发生了一些非常奇怪的事情。我有两个模块,一个名为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
。
我想知道,如何为每个模块使用单独的布局?
答案 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,但不再需要维护...我的解决方案的好处是您应该了解自己的所作所为。