Question

the directory structure I'm trying to achieve would be this:

application/default/views/layouts/layout.phtml
application/default/views/scripts/index/index.phtml
application/admin/views/layouts/layout.phtml
application/admin/views/scripts/index/index.phtml
library/Zend
config/config.ini
public/index.php (bootstrap)

but I can't figure out how to let Zend find my layout.phtml in each of my modules.

in my bootstrap I have:

define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application/'));
define('APPLICATION_ENVIRONMENT', 'testing');

//setup path to our library files
set_include_path( APPLICATION_PATH . '/../library' . PATH_SEPARATOR .
                  get_include_path() );

//register the autoloader
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload(); 

//set config in the registry
$config = new Zend_Config_Ini( APPLICATION_PATH . '/../config/config.ini', APPLICATION_ENVIRONMENT ); 
Zend_Registry::set('config', $config);

//setup logging
$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/../log/debug.log');
$logger = new Zend_Log($writer);
Zend_Registry::set('logger', $logger);

//run!
$frontController = Zend_Controller_Front::getInstance();
$frontController->addModuleDirectory(APPLICATION_PATH);
//initialize Zend_Layout's MVC helpers
Zend_Layout::startMvc();

$frontController->throwExceptions(true);

try {

    Zend_Controller_Front::getInstance()->dispatch();

} catch (Exception $exception) {

    echo '<html><body><center>'  . 'An exception occured while dispatching the front controller.'; 
    if (defined('APPLICATION_ENVIRONMENT') && APPLICATION_ENVIRONMENT != 'production'  ) {
        echo '<br /><br />' . $exception->getMessage() . '<br />'  . '<div align="left">Stack Trace:' . '<pre>' . $exception->getTraceAsString() . '</pre></div>'; 
    }
    echo '</center></body></html>';
    exit(1);
}

Where am I going wrong?

Update:

I haven't looked at this in a long time, so the accepted solution may not be up-to-date. If anyone wants to post a more up-to-date solution to this question (i.e. ZF 1.8+), please do so! It would be helpful to others who are looking for a solution to this.

Was it helpful?

Solution

You should check out Per Module Zend_Layout, in this article, the author covers exactly what you are trying to achieve. His methodology is to write a plugin for the front controller that handles layout registration.

OTHER TIPS

Using Zend Framework 1.12 (Haven't tested it on previous versions): works out of the box!

I usually use application.ini to setup things so, in orther to enable layouts:

resources.layout.layout = "layout"

...or whatever the default layout should be called. As "layoutPath" has not been defined Zend_Layout will look into "Application/modules//views/scripts" for a file called "layout.phtml"

If you use zend tool it will start layouts with the following line:

resources.layout.layoutPath = APPLICATION_PATH "layouts/scripts"

This is also fine, just delete the directory or avoid creating the default "layout.phtml". If the default layout is not found in that directory it will look into de modules as before for the "layout.phtml" inside "Application/modules//views/scripts".

If the layout is not found inside a module it will load the layout of the default module.

As simple as that!

If you need some extra work with your template you can add a plugin to it for example:

resources.layout.pluginClass = "YourLibrary_Controller_Plugin_Layout"

and do some extra stuff inside it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top