Zend_ViewでSmartyをラップする2

ドキュメント読んだり、ソースおったりしているうちに、

Zend_Controller_ActionクラスのinitViewをオーバーライドして、

Front Controllerにて、noViewRendererをtrueに設定して、

各アクションの最後に、$this->render()で、画面表示するのが、

一番楽なんじゃないかという結論に達しました。


重要なのは、initViewの中で、$this->viewに、Zend_View_Interfaceに

沿って作成したSmartyクラスを設定すること。

これがあって初めて、既存の$this->render()などが利用できます。


なぜこの方法にいきついたかの理由は、デフォルトのテンプレートエンジンである

Zend_Viewを利用する際には、ほとんど利用されていないメソッドだからです。

Zend_Viewを利用する場合、Zend_Controller_Action_Helper_ViewRendererという

ヘルパークラスが利用されています。


Frontコントローラーで、noViewRendererが設定されるなどして、

自動でレンダリング(画面描画)する機能がOFFにされていない限り、

上記のヘルパーを介して、Zend_Viewクラスを利用しています。

Zend_Controller_Actionの中の以下のメソッドでは、

上記ヘルパー内の同名のメソッドを呼び出します。


  ・render

  ・renderScript

  ・getViewScript


initViewに関しては、Actionクラスの生成時に同時に生成される

上記ヘルパークラスを、リターンするという内容になっています。


noViewRendererがONになっているときに、これらのメソッドを自分でプログラムに記述し、

Zend_Viewクラスを生成して、画面描画することもできますが、Zend_Viewを使うなら、

自動で行ってくれる処理を、なぜ手動にするか理由が見当たりません。

(自動描画は、必要な時だけOFFにすることもできるのです)


なので、別のテンプレートエンジンを利用するときに、オーバーライドするなら、ここかなと思ったのです。

ヘルパーを作るっていう手段もありますが、オーバーライドした方が簡単そうだったからです。

そのうち、勉強をかねて、ヘルパーを作る方法を試すかもしれません。


Smartyを利用することで、テンプレートの拡張子もデフォルトの”.pthml”でないものを

使いたい方もいるでしょう。その場合は、Actionクラス内のpublic変数である $viewSuffixを

書き換えることで変更可能です。


initViewを再定義した場合、Actionクラスのinit()などで呼び出さないと、

renderするタイミングまでインスタンスが生成されないため、テンプレートに

値を設定することができませんので、お忘れなく。

コメント 停止中

%d人のブロガーが「いいね」をつけました。