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#action_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 <k...@wedgeonline.co.za> 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:kaiohken1...@hotmail.com]
> *Sent:* 07 May 2009 10:50 PM
> *To:* matt...@zend.com; fw-general@lists.zend.com
> *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: matt...@zend.com
> > To: fw-general@lists.zend.com
> > Subject: Re: [fw-general] ZF1.8 Switching layouts between modules.
> >
> > -- Sergio Rinaudo <kaiohken1...@hotmail.com> 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.html#
> > > 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 | matt...@zend.com
> > Zend Framework | http://framework.zend.com/
>
> ------------------------------
> Cerchi i tuoi spazi? Hotmail va oltre i 5GB. Scopri 
> perché!<http://messenger.it/hotmail.aspx>
>

Reply via email to