Zend Framework と Smarty を連携
Zend Framework には Zend_View というビューがある。
今まで テンプレートエンジンには Smarty を使用してきたので、
Smarty を使い慣れている。
Zend_View ではアサインした値を表示するのに、
<?php echo $this->escape($val) ?>
とか書かなくてはいけない。
Smarty なら
{$val|escape}
となって、タイプ数も少ないし、テンプレートが見やすく感じるので、自分は Smarty を使う。
Zend Framework に Smarty を関連づける
Zend Framework は簡単に他のテンプレートエンジンを関連づけられる。
Zend_View_Interface というインターフェイスから派生させれば良い。
http://framework.zend.com/manual/ja/zend.view.scripts.html#zend.view.scripts.templates
上記URL に Smarty とのラッパークラスがあるので、それを使用する。
ただし、上記URL の getScriptPaths() の戻り値がstring となっているが、実際は array を応答するのが正しい。
Zend_Controller_Action_Helper_ViewRenderer() を使用した場合、ワーニングが出る。
※ Zend_View_Interface の getSctiptPaths() のメソッドのヘッダコメントには array を応答とある。
<?php /** * Retrieve all view script paths * * @return array */ public function getScriptPaths();
該当箇所を array で応答し、string を応答する、getScriptPath() というメソッドを定義しておく。
# 特に無くても問題ないけど、まぁ一応作ってみた。
<?php /** * 現在のテンプレートディレクトリを取得します * * @return array */ public function getScriptPaths() { return array($this->_smarty->template_dir); } /** * 現在のテンプレートディレクトリを取得します * * @return string */ public function getScriptPath() { return $this->_smarty->template_dir; }
Smarty 自体は library/Smarty というディレクトリに格納し、上記で作成したクラスは View.php とする。
ビューオブジェクトを生成するタイミングは ブートストラップのファイルで生成する事にした。
ブートストラップでビューオブジェクトを生成して、Zend_Controller_Action_HelperBroker() に登録する。
<?php $rootDir = "ルートディレクトリのパス"; foreach ($this->_configs['smarty'] as $key => $val) { switch ($key) { case 'template_dir' : case 'compile_dir' : case 'cache_dir' : case 'plugin_dir' : case 'debug_tpl' : $this->_smartyConfig[$key] = $rootDir . $val; break; default : $this->_smartyConfig[$key] = $val; break; } } // Smarty_View のコンストラクタの第2引数にテンプレートディレクトリを設定しているので、 // 設定しない。 $defaultTemplateDir = ''; $view = new Smarty_View($defaultTemplateDir, $this->_smartyConfig); $viewRender = new Zend_Controller_Action_Helper_ViewRenderer(); // テンプレートの拡張子を設定する $viewSuffix = 'tpl'; $viewRender->setView($view) ->setViewSuffix($viewSuffix); Zend_Controller_Action_HelperBroker::addHelper($viewRender);
$this->_smartyConfig には設定ファイルより読み込んだ値を代入している。
Zend_Controller_Action_Helper_ViewRenderer() を Zend_Controller_Action_HelperBroker() に設定することで、
自動的に、コントローラがテンプレートファイルを関連づけてくれる。
テンプレートファイルの作成
Zend_Controller_Action_Helper_ViewRenderer() を使用する場合はテンプレートファイルを
設置する場所も規約によって決まっている。
テンプレートファイルの設置場所のデフォルトの規約は、
/モジュール名/views/コントローラ名/アクション名.tplとなる。
ViewRenderer() を使用しない方法
Zend_Controller_Action_Helper_ViewRenderer() を使用せずに、
ビューオブジェクトを独自に作成する事も出来る。
ただし、ViewRenderer はデフォルトで有効なので、無効にする必要がある。
ViewRenderer はデフォルトで有効になっています。 これを無効にするには、フロントコントローラのパラメータ noViewRenderer を指定する ($front->setParam('noViewRenderer', true)) か、 あるいはヘルパーブローカからヘルパーを削除 (Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')) します。
http://framework.zend.com/manual/ja/zend.controller.actionhelpers.html
ViewRenderer を無効にし、コントローラやブートストラップで、Smarty オブジェクトを生成し、
<?php echo $smarty->render('テンプレートへのパス');
とかすれば、表示される。
いづれにせよ、Zend_View_Interface を利用すれば、様々なテンプレートエンジンを Zend Framework に追加できるところが素晴らしい。
余談だけど、Zend_View_Interface はPHP でのインターフェイスの利用例としてとても分かりやすいと思う。