我可以在Zend Framework中使用多个布局吗?

时间:2010-11-28 09:43:59

标签: zend-framework layout modular zend-layout

我在客户端的前端有一个带有图像旋转器的华丽页面。

对于后端我想要有不同的布局。我可以有多种布局吗?

有点暗示会很明显

4 个答案:

答案 0 :(得分:6)

我创建了一个布局插件,用于在调用非默认模块时切换布局:

class MyApplication_Layout_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout
{

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        switch ($request->getModuleName()) {
            case 'admin': $this->_moduleChange('admin');
        }
    }

    protected function _moduleChange($moduleName) {
        $this->getLayout()->setLayoutPath(
            dirname(dirname(
                $this->getLayout()->getLayoutPath()
            ))
            . DIRECTORY_SEPARATOR . 'layouts/scripts/' . $moduleName
        );
        $this->getLayout()->setLayout($moduleName);
    }

}

然后在我的Bootstrap中,我这样做:

Zend_Layout::startMvc(
            array(
                'layoutPath' => self::$root . '/application/views/layouts/scripts',
                'layout' => 'layout',
                'pluginClass' => 'MyApplication_Layout_Controller_Plugin_Layout'
            )
        );

非默认布局进入以模块命名的文件夹内,因此我的目录结构如下所示:

/path/to/application/views/layouts/scripts/layout.phtml --> default layout

/path/to/application/views/layouts/scripts/admin/admin.phtml --> admin layout

答案 1 :(得分:1)

是的,您可以拥有多个布局,但根据请求切换它们并非如此直接。

我必须做足够多次,以便我最终开发出一个控制器动作助手和应用程序资源插件,您可以自由使用或从中获取灵感。

ModuleLayout Application Resource Plugin

ModuleLayoutLoader Controller Action Helper

答案 2 :(得分:1)

尝试

//in controller
$this->_helper->layout->setLayout('layoutName');

它会将布局切换到模块的view / scripts文件夹中的layoutName.phtml;)

答案 3 :(得分:1)

这是错误的。这一行:

class MyApplication_Layout_Controller_Plugin_Layout extends end_Layout_Controller_Plugin_Layout

应为extends Zend_Controller_Plugin_Abstract。否则,您将收到有关mvcSuccessfulActionOnly的错误。