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 に答える