Foros del Web » Programando para Internet » PHP » Zend »

[ZF] Zend_Application y Modulos

Estas en el tema de [ZF] Zend_Application y Modulos en el foro de Zend en Foros del Web. Una de las novedades que tiene ZF en su versión 1.8 es la incorporación de Zend_Application para hacer más fácil el Bootstraping de los proyectos, ...
  #1 (permalink)  
Antiguo 26/05/2009, 08:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
[ZF] Zend_Application y Modulos

Una de las novedades que tiene ZF en su versión 1.8 es la incorporación de Zend_Application para hacer más fácil el Bootstraping de los proyectos, sin embargo hay muy poca documentación referente a que pasa cuando agregas modulos al proyecto, si bien indica que hay que agregar algo básico al ini:

Código:
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
Luego indica que se pueden establecer parámetros independientes para los modulos.

Ahora esto es real, pero hay algo que hacer antes de poder lograrlo y no esta documentado, y por lo que estuve buscando ayer en internet no muchos lo pudieron hacer tan sencillo, para poder activar el uso en el config de los modulos, primero hay que crear un Bootstrap por modulo, por ejemplo si es un modulo de admin:
Código php:
Ver original
  1. class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {}

Aquí hay que tener en cuenta dos cosas, es clave extender de Zend_Application_Module_Bootstrap , en lugar de Zend_Application_Bootstrap_Bootstrap o si no caes en una referencia circular.

Luego hay que agregar este parámetro en el ini:
Código:
resources.modules[] =
Para cargar el resource de los modulos o si no, no tendrá efecto el Module_Resource.

Ya con esos "cambios" ya podemos desde el ini establecer opciones para los submodulos, por ejemplo que usen un layout diferente:
Código:
admin.resources.layout.layout = "admin"
O una DB diferente:
Código:
admin.resources.db.params.dbname = "otra_db"
Espero con esto pueda alguien evitarse contratiempos, ya que no esta muy claro explicado en el Manual.

Saludos
  #2 (permalink)  
Antiguo 31/05/2009, 11:03
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años
Puntos: 43
Respuesta: [ZF] Zend_Application y Modulos

mmmm mucha vueltas no? eso es algo que no me gusta de zend muchas cosas para toquetear para que ande como dios manda jejeje, pero bue para los gustos los colores no?.
Muchas gracias amigo por la ayuda...
  #3 (permalink)  
Antiguo 01/06/2009, 08:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: [ZF] Zend_Application y Modulos

Pues digo es una forma si no quieres más bien toquetear tanto código, ya que fácilmente puedes hacer en tu Bootstrap:
Código php:
Ver original
  1. class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {
  2.       protected function _initAdminLayout() {
  3.              $this->bootstrap('layout');
  4.              $layout = $this->getResource('layout');
  5.              $layout->setLayout('admin');
  6.       }
  7. }

Y sirve igual, pero para dejarlo más "limpio" yo prefiero cambiarlo en el application.ini.

Saludos.
  #4 (permalink)  
Antiguo 06/06/2009, 00:25
Avatar de mstekl  
Fecha de Ingreso: mayo-2009
Ubicación: Solymar, Uruguay
Mensajes: 5
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: [ZF] Zend_Application y Modulos

es un dolor de cabeza esto. Porque los bootstraps de los modulos se ejecutan todos siempre. O sea, si cargo un layout diferente en el modulo admin, tambien se me esta cargando el mismo layout para el modulo por defecto.
No se si le estoy errando a algo, pero ya vi muchos threads sobre el tema en otros lugares y en ninguno encuentro una solucion.
  #5 (permalink)  
Antiguo 06/06/2009, 11:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: [ZF] Zend_Application y Modulos

Sí es un poco complicado, me acabo de dar cuenta de eso, que se ejecuta aún cuando no sea el mismo módulo, estoy haciendo unas pruebas para ver donde es la causa de esto y buscar un parche.

Por ahora lo que he hecho es en el init() de los controllers del modulo default cambio el layout nuevamente.

Saludos.
  #6 (permalink)  
Antiguo 06/06/2009, 19:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: [ZF] Zend_Application y Modulos

Ok, ya encontre la solución, y el problema venia desde no comprender al 100% Zend_Application, la solución es bastante simple, pero hay que entender algo, la razón por lo cual lo de arriba no funciona es porque no es la tarea de Zend_Application eso.

Zend_Application fue creado con la finalidad de hacer la inicialicación (bootstraping) de la aplicación más sencillo, después de terminar con la inicialización pasa el control al FrontController, para que haga el dispatch y posteriormente la ejecución del controlador.

Es decir durante el Bootstrap no hay forma de discriminar que modulo es al que se esta accesando ya que es el FrontController el que lee y analiza esa información.

Para solucionar esto y dejarlo de forma más limpia, es necesario usar dos clases, la primera es un Resource Plugin del Bootstrap, y la segunda es un Controller Plugin que establece el layout.

Es necesario agregar algunas cosas al ini, en este caso las clases que programe son de mi framework pero se pueden usar en cualquier framework:
Código:
pluginPaths.Gecko_Application_Resource_ = "Gecko/Application/Resource"
resources.moduleLayout.layouts.admin = "admin"
resources.moduleLayout.layouts.default = "layout"
En este caso estamos estableciendo dos modulos, para admin el layout admin.phtml y para el default layout.phtml.

Con esto podemos especificar diferentes layouts por modulo o en dado caso se va a cargar el "default" que especifiquemos en la llave resources.layout.layout.

Los plugins necesarios son los siguientes:

Resource Plugin:
Código php:
Ver original
  1. <?php
  2. //
  3. // +------------------------------------------------------------------------+
  4. // | Gecko Framework                                                        |
  5. // +------------------------------------------------------------------------+
  6. //
  7. require_once 'Zend/Application/Resource/ResourceAbstract.php';
  8.  
  9. /**
  10.  * Gecko_Application_Resource_Modulelayout
  11.  *
  12.  * Resource Loader to allow multiple layouts per module
  13.  *
  14.  * @package Gecko.Application.Resource;
  15.  * @author Christopher Valderrama <[email protected]>
  16.  * @access public
  17.  **/
  18. class Gecko_Application_Resource_ModuleLayout
  19.     extends Zend_Application_Resource_ResourceAbstract {
  20.    
  21.     /**
  22.      * The default controller plugin name
  23.      *
  24.      * @var string
  25.      */
  26.     protected $_pluginName = 'Gecko_Controller_Plugin_ModuleLayout';
  27.    
  28.     /**
  29.      * Initialize the plugin and layouts
  30.      *
  31.      * @return void
  32.      */
  33.     public function init() {
  34.         $bootstrap = $this->getBootstrap();
  35.         $bootstrap->bootstrap('frontController');
  36.         $bootstrap->bootstrap('layout');
  37.         $front = $bootstrap->getResource('frontController');
  38.        
  39.         $options = $this->getOptions();
  40.         $layouts = $options['layouts'];
  41.        
  42.         if (!is_array($layouts)) {
  43.             throw new Zend_Application_Resource_Exception('layouts is expected to be an array');
  44.         }
  45.        
  46.         $plugin = $options['plugin'];
  47.         if ($plugin === null) {
  48.             $plugin = $this->_pluginName;
  49.         }
  50.        
  51.         $front->registerPlugin(new $plugin($layouts));
  52.     }
  53. }

Controller Plugin:
Código php:
Ver original
  1. <?php
  2. //
  3. // +------------------------------------------------------------------------+
  4. // | Gecko Framework                                                        |
  5. // +------------------------------------------------------------------------+
  6. //
  7. require_once 'Zend/Controller/Plugin/Abstract.php';
  8.  
  9. /**
  10.  * Gecko_Controller_Plugin_ModuleLayout
  11.  *
  12.  * Zend Controller Plugin for setting layouts depending on the
  13.  * module
  14.  *
  15.  * @package Gecko.Application.Resource;
  16.  * @author Christopher Valderrama <[email protected]>
  17.  * @access public
  18.  **/
  19. class Gecko_Controller_Plugin_ModuleLayout
  20.     extends Zend_Controller_Plugin_Abstract {
  21.     /**
  22.      * Array that holds the layouts
  23.      * @var array
  24.      */
  25.     protected $_layouts = array();
  26.    
  27.     /**
  28.      * Initiates the plugin
  29.      *
  30.      * @param array $layouts
  31.      * @return void
  32.      */
  33.     public function __construct(array $layouts) {
  34.         $this->_layouts = $layouts;
  35.     }
  36.    
  37.     /**
  38.      * On dispatchLoopStartup read and set the correct layout
  39.      *
  40.      * @param Zend_Controller_Request_Abstract $request
  41.      * @return void
  42.      */
  43.     public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {
  44.         $module = $request->getParam('module');
  45.         if (isset($this->_layouts[$module])) {
  46.             $layout = Zend_Layout::getMvcInstance();
  47.             $layout->setLayout($this->_layouts[$module]);
  48.         }
  49.     }
  50. }

Estas dos clases pertenecen a mi Toolbox, pero no he hecho el commit así que las dejo aqui por ahora.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:24.