不同模块的多个布局 - Zend Framework

时间:2013-01-17 16:54:00

标签: zend-framework layout

我对Zend Framework中的布局有疑问。 这是我的项目结构:

  • 我有两个名为“backoffice”和“frontoffice”的模块。
  • 我在后台和前台的布局/脚本中都有一个layout.phtml。
  • 现在我想要“后台”和“前台”的单独“布局/脚本”
  • 在我的application.ini中,我有:resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

现在我怎么能解决这个问题呢?我有单独的布局?

3 个答案:

答案 0 :(得分:8)

只需在layout/scripts文件夹中放置另一个布局,并告诉任何模块,控制器或操作使用其他布局而不是默认布局。

如果您想让控制器使用不同的布局,您可以将以下内容放在init()

$this->_helper->layout->setLayout('layoutname');

您可以分别针对特定操作或整个模块执行此操作。

答案 1 :(得分:3)

将它放入您的application.ini

resources.layout.layout = "layout"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

您的布局文件将是/modules/MODULE_NAME/views/scripts/layout.phtml

答案 2 :(得分:1)

您应该为此目的编写前端控制器插件(称为布局选择器)。

在你的Bootstrap.php注册表中插件 - 布局选择器:

protected function _initPlugins(){
    $front = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new My_Plugins_LayoutSelector());
}

在application.ini中自动加载名称空间My_

Autoloadernamespaces[] = "My_"

最后,在/ library中创建一个新文件夹'我的'并在其中的文件夹'插件'并在文件' 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);
    }
}

通过这种方式,将来每个模块都将使用适当的布局,无需在每个控制器中写入以选择布局。