Thank you to everyone, especially to Mon that posted this ultra clear example.
I have just one more question about this, is better to keep a single layout
directory outside of the module
and the change the layout name, like I did:
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
{
public function lazyInit()
{
$appBootstrap = $this->getApplication();
$appBootstrap->bootstrap('layout');
$layout = $appBootstrap->getResource('layout');
$layout->setLayout('admin'); // same directory, APPLICATION_PATH
"/layouts" I changed only the layout name
}
}
or having a layout directory inside each module?
From: [email protected]
Date: Fri, 8 May 2009 10:17:10 +0800
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#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 <[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.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 | [email protected]
> Zend Framework |
http://framework.zend.com/
Cerchi i tuoi spazi? Hotmail va oltre i 5GB. Scopri perché!
_________________________________________________________________
Cerca le Parole, gioca su Typectionary!
http://typectionary.it.msn.com/