Zend Framework と Smarty を連携

Zend Framework には Zend_View というビューがある。

今まで テンプレートエンジンには Smarty を使用してきたので、
Smarty を使い慣れている。

Zend_View ではアサインした値を表示するのに、

<?php echo $this->escape($val) ?>

とか書かなくてはいけない。

Smarty なら

{$val|escape}

となって、タイプ数も少ないし、テンプレートが見やすく感じるので、自分は Smarty を使う。

Zend FrameworkSmarty を関連づける

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 でのインターフェイスの利用例としてとても分かりやすいと思う。