2012-05-09 5 views
0

現在、モジュールごとに異なるレイアウトファイルを読み込んでいます。モジュール固有のレイアウトプラグインは、.iniリソースとして動作しますが、ブートストラップファイルに登録されていないと動作しません。

私は私の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'); 
    } 
} 

すべてが正常に動作しますが、私は、ブートストラップで、このプラグインを登録することを好みますファイルと他のプラグイン私は、ブートストラップファイルにこのプラグインを移動し、このようにそれを登録するとき:

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

私は、取得するには、次のエラー:

致命的なエラー:C内の非オブジェクトのメンバ関数setLayoutPath()の呼び出し:\ workarea \ web_projects \ gam \ trunk \ website \ library \ Layout \ Plugin \ ModuleLayout.php on line 31

明らかに、私は何か間違っているか、このプラグインのしくみを誤解しています。誰も助けることができます。

おかげ..

EDIT:結局http://dustint.com/post/28/per-module-zend_layoutで溶液の修正版を使用。しかし、私はこれについての提案には開いています。このソリューションは通常のコントローラプラグを使用していますが、私はレイアウトプラグインタイプにする必要があると考えています。しかし、それは働いた。

+0

私はいつも標準のプラグインを使用していますが、これはかなり標準的なアプラックです。プラグイン 'Zend_Layout_Controller_Plugin_Layout'は主にフレームワークレベルのクラスで、ディスパッチサイクルに入り込み、コントローラ固有の表示内容をレイアウトスクリプトに挿入することができます。実際には、アプリ固有のプラグインの拡張ポイントとして意図されていません。 –

答えて

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)); 
} 
+0

Chrisさん、ありがとう、私はそれを試みましたが、循環リソース依存エラーを作成します。 – NaNuk

+0

"解決策"の質問への編集を参照してください – NaNuk

+0

ええ、私はあなたが編集したaproachが正しいと思います。私は個人的にコントローラのプラグインを使用してモジュールに基づいてレイアウトを切り替えます。それを行う正しい方法。 – Chris

関連する問題