Zend Framework 2 controller based layout

In Zend Framework 2 kan het soms wenselijk zijn een afwijkende layout te configureren voor een controller. Bijvoorbeeld om een admin & front controller te dienen met een afwijkende layout. Er zijn hiervoor een aantal voorbeelden te vinden maar was zelf niet helemaal tevreden hierover dus kwam uiteindelijk met het volgende om een verschil te maken tussen de PageAdminController.php & PageFrontController.php

module.config.php


return array(
    'view_manager' => array(
        'template_map' => array(
            'layout/layout' => __DIR__ . '/../view/layout/default.phtml',
            'layout/admin' => __DIR__ . '/../view/layout/admin.phtml',
            'layout/front' => __DIR__ . '/../view/layout/front.phtml',
        ),
    ),
);

module.php


public function onBootstrap($e)
{
    $eventManager = $e->getApplication()->getEventManager();
    $eventManager->getSharedManager()->attach(
        'Zend\Mvc\Controller\AbstractActionController',
        'dispatch',
        function ($e) {
            $controller = $e->getTarget();
            $ccString = preg_split('/(?=[A-Z])/', get_class($controller));
            $layoutType = strtolower($ccString[count($ccString) - 2]);
            $config = $e->getApplication()->getServiceManager()->get('config');
            if (isset($config['view_manager']['template_map']['layout/' . $layoutType])) {
                $controller->layout('layout/' . $layoutType);
            }
        }
    );
}

Wat hij nu doet is in de module.php op basis van de controller-naam controleren of er een layout gedefinieerd is. Zo niet dan doet hij niets en gebruikt hij de default (layout/layout). Bestaat hij wel dan gebruikt hij bijvoorbeeld de layout/admin of layout/front.

Geef een reactie

Jouw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *