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:mon...@gmail.com] 
Sent: 08 May 2009 04:17 AM
To: fw-general@lists.zend.com
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 <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.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 | 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