martes, 19 de junio de 2012

Layout para cada Módulo

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.


2 comentarios:

  1. Una consulta como podria crear un layout diferente para cada modulo, con zend framework 2, por ejemplo tengo 2 modulos front y back ya termine el front su layout y contenido pero cuando agrego otro modulo mi front coje el ultimo layout de todos y no quiero eso quiero uno independiente para cada modulo.

    ResponderEliminar
  2. Hola me aparece l siguiente erro:
    Fatal error: Class 'Plugins_Layouts' not found in /var/www/my/application/Bootstrap.php on line 9

    Gracias espero puedas decirme a que se deve

    ResponderEliminar

Gracias por sus comentarios!