Thanks Mon, After reading Mathews comment, I have eventually managed to get custom layouts per module. I am not entirely happy with the solution though and see it as a bit of a hack. My understanding of a modular structure should have allowed me to override any defaults set in the main bootstrap with the current modules setup. I don't really see the point of having separate bootstraps if they're all being called regardless of how you access your app. The documentation is not very clear in this regard and the 'news' example seems to indicate that individual layouts are possible via standard means. Example 4.4. Configuring Modules
You can specify module-specific configuration using the module name as a prefix/sub-section in your configuration file. For example, let's assume that your application has a "news" module. The following are INI and XML examples showing configuration of resources in that module. news.resources.layout.layout = "news.phtml" This is clearly not the case and the only way to switch layouts is via the controller plugin. Regards, Karl ________________________________ From: Mon Zafra [mailto:[email protected]] Sent: 08 May 2009 04:17 AM To: [email protected] Subject: Re: [fw-general] ZF1.8 Switching layouts between modules. What you basically need is to defer the setting of layout until routeShutdown. This can be done with a controller plugin. Matthew's suggestion [http://framework.zend.com/issues/browse/ZF-6568?focusedCommentId=30741#acti on_30741 ] is to have your module bootstrap register a plugin which implements routeShutdown() or dispatchLoopStartup(). The plugin method checks the current module, then do stuff if it matches with the calling bootstrap module. Personally, I don't like this method because it could lead to lots of unused plugins. I prefer to have only one plugin that pulls the current module from the request, pulls its bootstrap from the modules resource and executes a specific method. class Mz_Plugin_ModuleLazyInit extends Zend_Controller_Plugin_Abstract { protected $_bootstraps; public function __construct($bootstraps) { $this->_bootstraps = $bootstraps; } public function routeShutdown(Zend_Controller_Request_Abstract $request) { $module = $request->getModuleName(); if (isset($this->_bootstraps[$module])) { $bootstrap = $this->_bootstraps[$module]; if (method_exists($bootstrap, 'lazyInit')) { $bootstrap->lazyInit(); } } } } // application bootstrap protected function _initPlugins() { if ($this->hasPluginResource('modules')) { $this->bootstrap('modules'); $this->bootstrap('frontController'); $bootstraps = $this->getResource('modules'); $front = $this->getResource('frontController'); $plugin = new Mz_Plugin_ModuleLazyInit($bootstraps); $front->registerPlugin($plugin); } } // module bootstrap public function lazyInit() { $appBootstrap = $this->getApplication(); $appBootstrap->bootstrap('layout'); $layout = $appBootstrap->getResource('layout'); $layout->setLayoutPath(dirname(__FILE__) . '/layouts'); } -- Mon On Fri, May 8, 2009 at 8:25 AM, Karl <[email protected]> wrote: I still have the same problem and have not been able to get different layouts to work when using modules. Can this actually be achieved or are we all trying something that has not been implemented ? Regards, Karl ________________________________ From: Sergio Rinaudo [mailto:[email protected]] Sent: 07 May 2009 10:50 PM To: [email protected]; [email protected] Subject: RE: [fw-general] ZF1.8 Switching layouts between modules. Hi matthew, I added the line you said, and the layout is switched, but unfortunatelly for all modules, so also the default module is rendered with the admin layout. Any advice? Sergio Rinaudo > Date: Thu, 7 May 2009 16:18:44 -0400 > From: [email protected] > To: [email protected] > Subject: Re: [fw-general] ZF1.8 Switching layouts between modules. > > -- Sergio Rinaudo <[email protected]> wrote > (on Thursday, 07 May 2009, 08:54 PM +0200): > > I've almost completed to implement all my past work in the new > > Zend_Application, I still have the problem on how switch layouts between > > modules. I noticed here you can specify this in the configuration ini file: > > > > http://framework.zend.com/manual/en/zend.application.available-resources.htm l# > > zend.application.available-resources.modules.configExample > > > > but if I add this line on my ini > > > > admin.resources.layout.layout = "admin" > > > > I get the error > > > > Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with > > message 'Resource matching "frontcontroller" not found' in > > I know what's happening here. > > The layout resource has this: > > $this->getBootstrap()->bootstrap('FrontController'); > > The problem is that your _module_ bootstrap doesn't have the resources > that the _application_ bootstrap had -- and so it's finding no matching > resource to bootstrap. > > One workaround is to add this to your configuration: > > admin.resources.frontController[] = > > This will grab and return the front controller singleton, which should > work for these purposes. > > -- > Matthew Weier O'Phinney > Project Lead | [email protected] > Zend Framework | http://framework.zend.com/ ________________________________ Cerchi i tuoi spazi? Hotmail va oltre i 5GB. Scopri perché! <http://messenger.it/hotmail.aspx>
