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:
First, download the Plugin
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());
}
}
Next, add the Galahad namespace
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_.
Next, add the Plugin
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);
}
And you’re set!
Just make sure you have a layout file in your layouts directory for each module (modulename.phtml).
Related posts:
- Zend Framework Bash Completion Script If you use the Zend Framework CLI interface much you...
- Zend Framework URI validator & filter For the last couple of months I’ve been incorporating portions...
- Installing Zend Server & Zend Framework on OS X This post is mostly a reminder to myself, but I...
- PHP Modeling (in Zend Framework) I’ve been thinking a lot about Modeling in a MVC...
- Better Zend Framework Documentation If you’ve every tried to navigate the Zend Framework documentation’s...