Разная компоновка для разных модулей

Что-то действительно странное происходит. У меня есть два модуля, один называется, 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. Мне было интересно, как использовать отдельные макеты для каждого модуля?

php,zend-framework,zend-framework2,

1

Ответов: 1


1

У меня была такая же проблема в предыдущем проекте ZF2. Проблема в том, что вы используете один и тот же идентификатор «layout / layout» для обоих модулей и при слиянии конфигурации, один из них потерян.

Идея состоит в том, чтобы дать разные имена для идентификаторов и использовать абстрактный контроллер, который позволит изменить макет. А на dispatchмероприятии вы присоединяете функцию, которая будет устанавливать макет для вашего модуля:

Module.php (вашего основного модуля)

public function onBootstrap($e)
{
    $e->getApplication()->getEventManager()->getSharedManager()->attach('ZendMvcControllerAbstractController', '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 , но он больше не поддерживается ... Хорошим моментом моего решения является то, что вы должны понимать, что вы делаете.

PHP, Зенд-рамка, Зенд-framework2,
Похожие вопросы