Someone was recently asking on ZFTalk about how to use a different layout for each module in your application. Since this is a problem I’ve dealt with in the past and planned on adding to the Galahad FE, I thought I’d quickly write up a tutorial on how to do it:
Put the following class in a library/Galahad/Controller/Plugin/Modularlayout.php file (you’ll probably have to create all those directories and the file).
<?php
/**
* This file is part of the Galahad Framework Extension.
*
* The Galahad Framework Extension is free software: you can redistribute
* it and/or modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* The Galahad Framework Extension is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* @category Galahad
* @package Galahad
* @copyright Copyright (c) 2009 Chris Morrell <http://cmorrell.com>
* @license GPL <http://www.gnu.org/licenses/>
* @version 0.2
*/
/**
* Use separate layout per module
*
* @category Galahad
* @package Galahad
* @copyright Copyright (c) 2009 Chris Morrell <http://cmorrell.com>
* @license GPL <http://www.gnu.org/licenses/>
*/
class Galahad_Controller_Plugin_Modularlayout extends Zend_Controller_Plugin_Abstract
{
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
Zend_Layout::getMvcInstance()->setLayout($request->getModuleName());
}
}
Update your Bootstrap.php file’s autoloader initialization method (if you don’t have one, add one):
protected function _initAutoloaders()
{
$this->getApplication()->setAutoloaderNamespaces(array('Galahad_'));
return $this;
}
Please note: You might need to have other namespaces in there, like My_ or App_ or Default_.
Update your Bootstrap.php file’s plugin initialization method (if you don’t have one, add one):
protected function _initPlugins()
{
$this->bootstrap('autoloaders');
$this->bootstrap('frontController');
$plugin = new Galahad_Controller_Plugin_Modularlayout();
$this->frontController->registerPlugin($plugin);
}
Just make sure you have a layout file in your layouts directory for each module (modulename.phtml).
Additional comments powered by BackType
You can leave a response, or trackback from your own site. Follow any responses to this entry through the RSS 2.0 feed.
You appear to be using a Front controller Plugin for an action helper!
please don’t do that, either its one or its the other.
Yes they are very similar, but they actually should perform two different functions, an action helper should provide something useful to you in an action, or do something such as the viewRenderer, which renders the view for you.
you should instead simply register the plugin with the Front controller, where it will do pretty much the same thing, and yes it is all semantics, but semantics are for clarity, and your bluring that!
Shoot! Good call—fixed.
Chris Morrell posted: Zend Framework: Using separate layouts per module (http://bit.ly/ADJEV)
This comment was originally posted on Twitter
it is written
“Put the following class in a library/Galahad/Plugin/Modularlayout.php” but definition starts with
“class Galahad_Controller_Plugin_Modularlayout”
I think “/Controller/” is missed in the path.
Good point! Fixed.