En nuestra estructura modular se han diseñado 3 módulos, default, admin y bibloteca, para facilitar el cambio del layout se ha creado un Front Controller Plugin.
Que es un Front Controller Plugin
Es un clase que extiende de Zend_Controller_Plugin_Abstract que permite mejorar el comportamiento y la versatilidad de nuestra aplicación, ahorrando muchas lineas de código a través de los controllers. El Front Controller Plugin permite interceptar a través de seis eventos o hooks y ejecutar ciertas acciones que nos facilitaran el trabajo.
- routeStartup () : antes de la solicitud de enrutamiento
- routeShutdown () : después de la solicitud de enrutamiento
- dispatchLoopStartup () : antes de entrar en el bucle de envío
- preDispatch () : antes de despachar una acción individual
- postDispatch () : tras el envío de una acción individual
- dispatchLoopShutdown () : después de completar el bucle de envío
Registro de plugins application.ini
;Registrar Plugins
autoloaderNamespaces[] = "Plugins_"
resources.frontController.plugins.Layouts = "Plugins_Layouts"
Indica que en el directorio de library se creará una carpeta Plugins y que la clase se llamará Layouts.php. Con la linea resource.frontController.plugins, registramos y activamos el plugin, aunque tambien lo podemos hacer en el Bootstrap
Crear la clase Layouts
class Plugins_Layouts extends Zend_Controller_Plugin_Abstract {
private $_nombreModulo;
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$this->_nombreModulo = $request->getModuleName();
$layout = Zend_Layout::getMvcInstance();
switch ($this->_nombreModulo)
{
case 'admin':
$layout->setLayout('admin');
break;
case 'biblioteca':
$layout->setLayout('biblioteca');
break;
default:
$layout->setLayout('default');
break;
}
}
}
La clase será utilizada en el evento preDispatch
Activar de plugin en Bootstrap
protected function _initRegisterPlugins()
{
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Plugins_Layouts());
}
Con esta funcionalidad al cambiar de modulo, automáticamente se cambiará el layout de la aplicación. Adicional a éste podríamos organizarlo para detectar el perfil del usuario y mostrar un layout especifico.