Plantillas diferentes en cada módulo de Zend Framework 2

Como sabemos, en cada método action de un controlador podemos forzar el uso de una plantilla u otra incluso combinar varias vistas, pero no hasta ahora no teníamos una forma clara de automatizar este proceso, sin tener que escribir una línea de código en cada método action.

Vamos a ver como automatizar el uso de plantillas diferentes en cada módulo de Zend Framework 2.

En nuestro Module.php tendremos un método similar a este:

public function onBootstrap(MvcEvent $e){
	$eventManager        = $e->getApplication()->getEventManager();
	
	/*
	 * Básicamente lo que hacen las siguientes líneas es cargar en cada método action
	 * de cada controlador del modulo actual una plantilla diferente consiguiendo
	 * éstas de un archivo de configuración con el array module_layouts
	 */
	$eventManager->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);
	
	
	$moduleRouteListener = new ModuleRouteListener();
	$moduleRouteListener->attach($eventManager); 
}

Esto lo podemos poner en todos los Module.php de todos los módulos, o en un solo módulo de la aplicación.

A continuación crearemos el fichero de configuración config/global.php que seguramente ya tendremos, así que le añadimos un nuevo elemento al array.

<?php
/**
 * Global Configuration Override
 *
 * You can use this file for overriding configuration values from modules, etc.
 * You would place values in here that are agnostic to the environment and not
 * sensitive to security.
*/

return array(
   'service_manager' => array(
         'invokables' => array(
            'Zend\Authentication\AuthenticationService' => 'Zend\Authentication\AuthenticationService',
         ),
     ),
	 


	 /*
		Indicamos el nombre del módulo y la plantilla a utilizar.
		Los nombres de las plantillas deben ser diferentes aún no siendo utilizadas,
a nivel global.
Si tenemos alguna plantilla con el mismo nombre puede que zf2 se confunda a la hora de cargarlas.
	 */



    'module_layouts' => array(
       'Application' => 'layout/layout.phtml',
       'Frontend'=> 'layout/layout_front.phtml',
       'Backend' => 'layout/layout2.phtml',
   ),
);

Ahora podemos probar el funcionamiento.

Si entramos al módulo Frontend de forma automática nos asigna una plantilla:
Plantillas diferentes en cada módulo de zend framework 2

Y si entramos al módulo Application nos carga otra:
Plantillas diferentes en cada módulo de zend framework 2 2

Más información:
http://stackoverflow.com/questions/16351034/use-differents-layouts-to-differents-modules-zend-framework-2
http://framework.zend.com/manual/2.3/en/modules/zend.view.helpers.html
http://framework.zend.com/manual/2.3/en/modules/zend.view.quick-start.html

Victor

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post

3 Comentarios

  1. Excelente, funciona muy bien!

    Responder
  2. Por alguna razón no me carga las css correctamente, no logra cargarlas en el segundo layout, solo en uno

    Responder
    • ¿Te muestra algún error o algo?

      Responder

Poner un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *