Zend_Layout で Smarty を使う

Zend Framework 1.5 PR の Zend_Layout をいじくる続き。
デフォルトの Zend_View を使用して Zend_Layout で表示できるのを確認したので、
今度はビューオブジェクトに Smarty を使用してみる。

19.4.1. ビューオブジェクトのカスタマイズ
Zend_Layout では、 Zend_View_Interface を実装した任意のクラスや Zend_View_Abstract を継承した任意のクラスを用いて レイアウトスクリプトレンダリングすることができます。 独自のビューオブジェクトを単純に constructor/startMvc() のパラメータとして渡すか、 あるいはアクセサ setView() で設定します。

http://framework.zend.com/manual/ja/zend.layout.advanced.html#zend.layout.advanced.view

Zend_View_Interface / Zend_View_Abstract を継承したクラスだと、Zend_Layout は使用できる。
ということで、Smarty は ドキュメントに載っているクラスを使用する。
http://framework.zend.com/manual/ja/zend.view.scripts.html#zend.view.scripts.templates


Smartyインスタンスは Zend_Controller_Action_Helper_ViewRenderer(); に設定する必要がある。
ブートストラップのファイルに次のように記述する。

<?php
        $view = new Smarty_View(null, $this->_smartyConfig);

        require_once 'Zend/Controller/Action/Helper/ViewRenderer.php';
        $viewRender = new Zend_Controller_Action_Helper_ViewRenderer();
        // テンプレートのデフォルトの拡張子 
        $viewSuffix = 'tpl';
        $this->_viewSuffix = $viewSuffix;        
        $viewRender->setView($view)
                   ->setViewSuffix($viewSuffix);
        Zend_Controller_Action_HelperBroker::addHelper($viewRender);

        require_once 'Zend/Layout.php';
        $layout = new Zend_Layout($options, true)
        $layout->setView($this->view)
            ->setViewSuffix($this->viewSuffix);


実行したら、エラーになった(´・ω・`)

Fatal error: Call to undefined method Smarty_View::addScriptPath() in library/Zend/Layout.php on line 725

Zend_Layout の該当ソースを見てみる。

<?php
    public function render($name = null)
    { 
        if (null === $name) {
            $name = $this->getLayout();
        }
        
        if ($this->inflectorEnabled() && (null !== ($inflector = $this->getInflector())))       
        {   
            $name = $this->_inflector->filter(array('script' => $name));
        }
    
        $view = $this->getView();

        if (null !== ($path = $this->getLayoutPath())) {
            $view->addScriptPath($path);
        }

        return $view->render($name);
    }

$view->addScriptPath($path); がエラー箇所で、Zend_View_Interface を拡張した
Smarty のビュークラスには addScriptPath() というメソッドがない。


そもそもの Zend_View で addScriptPath() では何をやっているのかというと、
表示するテンプレートを探すディレクトリをスタックに積み、LIFO で取り出すようだ。

実は、addScriptPath() メソッドを使用すると、検索パスを 「積み重ねる」ことができます。これを使用すると、Zend_View は一番最後に追加されたパスからビュースクリプトを探し始めます。 この仕組みを利用すると、デフォルトのビューを独自のビューで上書きできるようになります。 いくつかのビューに対して独自の「テーマ」あるいは「スキン」 を作成し、その他のビューはそのままにしておくことが可能となります。

<?php
$view = new Zend_View();
$view->addScriptPath('/path/to/app/views');
$view->addScriptPath('/path/to/custom/');

// $view->render('booklist.php') をコールすると、Zend_View は
// まず最初に "/path/to/custom/booklist.php" を探し、
// 次に "/path/to/app/views/booklist.php"、そして最後に
// カレントディレクトリから "booklist.php" を探します。

とりあえず、検索対象のディレクトリを増やすかどうかはまた必要になったら考える事にして、現状は setScriptPath() を呼ぶように追加した。
Smarty_View に以下を追加。

<?php
    public function addScriptPath($name)
    {
        $this->setScriptPath($name);
    }

これで、レイアウトファイルが表示されるようになった。
コンテンツ部分の表示は、また後で書く。