如何让每个模块都拥有自己的布局目录?
即。当我没有任何模块时,配置文件中的布局条目如下所示:
resources.layout.layoutPath = APPLICATION_PATH "/layouts"
我尝试输入即。
; Layout directory for admin module
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts"
其中admin是模块名称;但它不起作用。出于某种奇怪的原因,ZF在/ module / admin / views / scripts目录中查找模块布局。
根据this tutorial,每个模块都有一个单独的module.ini配置文件,唉布局路径也会被忽略。此外,我一直在尝试遵循这些模块layout tutorial,但它不起作用,我想由于ZF版本的差异(教程相当陈旧)。所以我不知道还能做什么
答案 0 :(得分:2)
使用教程中的插件,您将被讨论:
class My_Controller_Plugin_RequestedModuleLayoutLoader extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$config = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getOptions();
$moduleName = $request->getModuleName();
if (isset($config[$moduleName]['resources']['layout'])) {
Zend_Layout::startMvc($config[$moduleName]['resources']['layout']);
}
}
}
的application.ini
resources.frontController.plugins.layoutloader = My_Controller_Plugin_RequestedModuleLayoutLoader
module.ini中:
resources.layout.layout = "Admin"
resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts/scripts"
工作正常。
答案 1 :(得分:2)
Ololo推荐的一种稍微替代方法(这是一种很好的方法)..
class YourApp_Controller_Plugin_Modulelayout extends Zend_Controller_Plugin_Abstract
{
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
if ($module != 'default')
{
if (file_exists(APPLICATION_PATH . '/layouts/' . $module . '.html')) {
Zend_Layout::getMvcInstance()->setLayout($module);
}
}
}
}
将此控制器插件放在/library/YourApp/Controller/Plugin/Modulelayout.php中 然后将模块布局作为模块名称保存在layouts文件夹中(例如,/layout / admin.phtml)。如果找不到该模块的布局,它将默认返回layout.phtml或您最初设置的任何布局。
答案 2 :(得分:2)
看看这个要点 - https://gist.github.com/891384
这使用了
的组合layout
挂钩中的布局layoutPath
和preDispatch
属性答案 3 :(得分:1)
也发生在我身上我通过在我的控制器中使用这一行来解决它(我创建了一个init函数)
Zend_Layout::startMvc(array('layoutPath' => APPLICATION_PATH . '/modules/admin/layouts'));
答案 4 :(得分:0)
从Zend Framework 1.12开始(尚未在以前的版本中测试过):
以您喜欢的方式初始化布局。例如在application.ini中作为zend工具执行:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
在每个模块中创建一个布局,在模块路径中使用默认布局名称“views / scripts /”,例如“application / modules / default / views / scripts / layout.phtml”
< / LI> 醇>不要忘记为默认模块创建一个,因为它将是您的后备布局!
请勿在/ application / layouts / scripts中创建默认布局,否则无效
你准备好了!
当Zend_Layout找不到默认的layut时,它会查看模块文件夹。
如果您需要一些额外的调整,您可以创建一个插件并将其分配给布局对象本身。例如,在application.ini中:
resources.layout.pluginClass = "MyLibrary_Controller_Plugin_Layout"
......或者在Bootstrap中:
Zend_Layout::getMvcInstance()->setPluginClass("MyLibrary_Controller_Plugin_Layout");
干杯!