Ver Mensaje Individual
  #6 (permalink)  
Antiguo 06/06/2009, 19:19
Avatar de GatorV
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.