Zend Framework:如何在模块化应用程序中设置布局目录?

时间:2009-01-24 00:49:05

标签: php zend-framework bootstrapping

我想要实现的目录结构是:

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)

但我无法弄清楚如何让Zend在我的每个模块中找到我的layout.phtml。

在我的引导程序中我有:

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);
}

我哪里错了?

更新

我很长时间没有看过这个,所以接受的解决方案可能不是最新的。如果有人想发布这个问题的最新解决方案(即ZF 1.8+),请这样做!对于那些正在寻找解决方案的人来说,这会有所帮助。

2 个答案:

答案 0 :(得分:4)

您应该查看Per Module Zend_Layout,在本文中,作者将详细介绍您要实现的目标。他的方法是为前端控制器编写一个处理布局注册的插件。

答案 1 :(得分:2)

使用Zend Framework 1.12(尚未在以前的版本上测试过):开箱即用!

我通常使用application.ini进行设置,以便在其他地方启用布局:

resources.layout.layout = "layout"

...或者应该调用默认布局。由于尚未定义“layoutPath”,Zend_Layout将查看名为“layout.phtml”的文件的“Application / modules // views / scripts”

如果您使用zend工具,它将使用以下行开始布局:

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

这也没关系,只需删除目录或避免创建默认的“layout.phtml”。如果在该目录中找不到默认布局,它将像以前一样查看de modules中的“application / modules // views / scripts”中的“layout.phtml”。

如果在模块内找不到布局,它将加载默认模块的布局。

就这么简单!

如果您需要对模板进行一些额外的工作,可以添加一个插件,例如:

resources.layout.pluginClass = "YourLibrary_Controller_Plugin_Layout"

并在其中做一些额外的事情。