我对 Zend Framework 中的布局有疑问。这是我的项目结构:
- 我有 2 个名为“backoffice”和“frontoffice”的模块。
- 我在后台和前台的布局/脚本中有一个 layout.phtml。
- 现在我想为“后台”和“前台”分别设置“布局/脚本”
- 在我的 application.ini 中,我有:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
现在我该如何解决这个我有单独的布局?
我对 Zend Framework 中的布局有疑问。这是我的项目结构:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
现在我该如何解决这个我有单独的布局?
只需在layout/scripts
文件夹中放置另一个布局,并告诉任何模块、控制器或操作使用该其他布局而不是默认布局。
如果你想让控制器使用不同的布局,你可以在你的init()
$this->_helper->layout->setLayout('layoutname');
您可以分别针对特定操作或整个模块执行此操作。
把它放到你的 application.ini
resources.layout.layout = "layout"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
您的布局文件将是 /modules/MODULE_NAME/views/scripts/layout.phtml
您应该为此目的编写前端控制器插件(称为布局选择器)。
在您的 Bootstrap.php 中注册该插件 - 布局选择器:
protected function _initPlugins(){
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new My_Plugins_LayoutSelector());
}
在 application.ini 中自动加载命名空间 My_
Autoloadernamespaces[] = "My_"
最后,在 /library 中创建一个新文件夹“My”,并在其中创建文件夹“Plugins”,并在其中包含代码的文件“LayoutSelector.php”:
class My_Plugins_LayoutSelector extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$module = $request->getModuleName();
$layout = Zend_Layout::getMvcInstance();
$layout->setLayout($module);
}
}
这样以后每个模块都会使用合适的布局,不需要在每个控制器中编写来选择布局。
我使用这个自定义插件进行了一些更改,并为每个模块创建了特定的布局,具有特定的结构 http://blog.vandenbos.org/2009/07/19/zend-framework-module-specific-layout/