0

我目前正在为每个模块加载不同的布局文件。

我已将以下内容添加到我的 config.ini 文件中

; Module Support
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

; Module-based Layout Support
resources.layout.pluginClass= "Layout_Plugin_ModuleLayout"

以及以下控制器插件:

class Layout_Plugin_ModuleLayout extends Zend_Layout_Controller_Plugin_Layout {    

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $this->getLayout()->setLayoutPath(
            Zend_Controller_Front::getInstance()
                ->getModuleDirectory($request->getModuleName()) . '/layouts'
        );
        $this->getLayout()->setLayout('layout');
    }   
}

一切正常,但我更愿意将此插件与其他插件一起注册到引导文件中。当我将此插件移动到 Bootstrap 文件并像这样注册它时:

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

我收到以下错误:

致命错误:在第 31 行调用 C:\workarea\web_projects\gam\trunk\website\library\Layout\Plugin\ModuleLayout.php 中非对象的成员函数 setLayoutPath()

显然,我做错了什么或者误解了这个插件是如何工作的。

编辑:最终在http://dustint.com/post/28/per-module-zend_layout使用了解决方案的修改版本。但是,我愿意接受有关此的建议。这个解决方案使用普通的控制器插件,而我怀疑我应该让我们使用布局插件类型。然而,它奏效了。

4

2 回答 2

1

问题是布局资源初始化了一些东西,如果你查看 Zend_Layout_Controller_Plugin_Layout 的源代码,你需要传递布局来使用,所以你可能需要在你的引导程序上这样做:

protected function _initLayouts()
{
     $this->bootstrap('layout');
     $this->bootstrap('frontController');
     $layout = $this->getResource('layout');

     $front = $this->getResource('frontController');
     $front->registerPlugin(new Layout_Plugin_ModuleLayout($layout));
}
于 2012-05-09T18:38:27.647 回答
0

最终在http://dustint.com/post/28/per-module-zend_layout使用了解决方案的修改版本。

于 2012-05-17T17:57:23.987 回答