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<?php
//
// +------------------------------------------------------------------------+
// | Gecko Framework |
// +------------------------------------------------------------------------+
//
require_once 'Zend/Application/Resource/ResourceAbstract.php';
/**
* Gecko_Application_Resource_Modulelayout
*
* Resource Loader to allow multiple layouts per module
*
* @package Gecko.Application.Resource;
* @access public
**/
class Gecko_Application_Resource_ModuleLayout
extends Zend_Application_Resource_ResourceAbstract {
/**
* The default controller plugin name
*
* @var string
*/
protected $_pluginName = 'Gecko_Controller_Plugin_ModuleLayout';
/**
* Initialize the plugin and layouts
*
* @return void
*/
public function init() {
$bootstrap = $this->getBootstrap();
$bootstrap->bootstrap('frontController');
$bootstrap->bootstrap('layout');
$front = $bootstrap->getResource('frontController');
$options = $this->getOptions();
$layouts = $options['layouts'];
throw new Zend_Application_Resource_Exception('layouts is expected to be an array');
}
$plugin = $options['plugin'];
if ($plugin === null) {
$plugin = $this->_pluginName;
}
$front->registerPlugin(new $plugin($layouts));
}
}
Controller Plugin:
Código php:
Ver original<?php
//
// +------------------------------------------------------------------------+
// | Gecko Framework |
// +------------------------------------------------------------------------+
//
require_once 'Zend/Controller/Plugin/Abstract.php';
/**
* Gecko_Controller_Plugin_ModuleLayout
*
* Zend Controller Plugin for setting layouts depending on the
* module
*
* @package Gecko.Application.Resource;
* @access public
**/
class Gecko_Controller_Plugin_ModuleLayout
extends Zend_Controller_Plugin_Abstract {
/**
* Array that holds the layouts
* @var array
*/
protected $_layouts = array();
/**
* Initiates the plugin
*
* @param array $layouts
* @return void
*/
public function __construct
(array $layouts) { $this->_layouts = $layouts;
}
/**
* On dispatchLoopStartup read and set the correct layout
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {
$module = $request->getParam('module');
if (isset($this->_layouts
[$module])) { $layout = Zend_Layout::getMvcInstance();
$layout->setLayout($this->_layouts[$module]);
}
}
}
Estas dos clases pertenecen a mi
Toolbox, pero no he hecho el commit así que las dejo aqui por ahora.
Saludos.