いろいろ準備中

[Zend Framework][Smarty] Zend_Layout ③ Smartyに対応させてみる

6月 6th, 2008 Posted in Zend Framework

今回はZend_View_Interfaceを実装してSmartyに対応させたビューをZend_Layoutへ対応させてみようという試みです。
使用するSmartyのクラスはこれ(ViewSmarty)です。

まずはZend_Layoutにviewを登録する方法ですが、以下のどちらかの方法でViewSmartyのクラスを登録します(まだ他にもあるかもしれません)。

  • Zend_Layoutの$_viewプロパティに設定する
  • Zend_Controller_Action_Helper_ViewRendererに登録する


・Zend_Layoutの$_viewプロパティに設定する

require_once 'Zend/Layout.php';
require_once 'ViewSmarty.php';
 
Zend_Layout::startMvc(array(
        'view' => new ViewSmarty(),
));

もしくは

require_once 'Zend/Layout.php';
require_once 'ViewSmarty.php';
 
Zend_Layout::startMvc();
$layout = Zend_Layout::getMvcInstance();
$layout->setView(new ViewSmarty());

・Zend_Controller_Action_Helper_ViewRendererに登録する

require_once 'Zend/Controller/Action/Helper/ViewRenderer.php';
require_once 'Zend/Layout.php';
require_once 'ViewSmarty.php';
 
Zend_Controller_Action_HelperBroker::addHelper(
	new Zend_Controller_Action_Helper_ViewRenderer(new ViewSmarty())
);
Zend_Layout::startMvc();

この記述は bootstrap.phpに書くと良いでしょう。

これで実行すると、addScriptPath()がないというエラーが出ます。
addScriptPath()関数はZend_View_Abstract関数で実装されています。これは指定したパスを現在のビュースクリプトを走査するパスへ追加します。Smatryをざっと見たところ、複数のパスを設定することはできなさそうでした。ViewSmatyのほうで仕掛けを作ってやる必要がありそうです。
今回ところは、Zend_View_Interfaceにも規定されているsetScriptPath()関数のエイリアスとしておきます。

/**
 * Zend_Layout対応
 * Smartyではスクリプトパス(template_dir)は複数指定で
 * きないので、setScriptPath()のエイリアスとしておく。
 * 配列が渡された場合は最初の要素をパラメタとする。
 *
 * @return string|array $path
 */
public function addScriptPath($path) {
    if(is_array($path)) {
        $path = array_shift($path);
    }
    return $this->setScriptPath($path);
}

続いて、スクリプトファイル内でZend_Layoutのオブジェクトを参照できるようにしておきます。render()関数を修正します

public function render($name) {
    // 以下の記述を追加
    $this->_smarty->assign(
            'layout',
            Zend_Layout::getMvcInstance()
    );
 
    return $this->_smarty->fetch($name);
}

スクリプトファイルの書き方は前回のレイアウトスクリプトを例に修正します。

<html>
  <head>
    <title>Zend_Layout Test Page</title>
  </head>
  <body>
    <h1>Zend_Layout Test Page</h1>
    {$layout->menu}
    {$layout->content}
  </body>
</html>

これで出力できると思います。ただし、デフォルトのmodifierにescape:”html”などエスケープするものを設定しているとうまく表示できない場合があります。この件でもそうですがなんとなく、Zend Frameworkを使うならテンプレートシステムはZend_View(_Abstract)を使えというようなメッセージを感じ取れます。

まだまだ対応が不十分ですが(リファレンスガイドにあるプレースホルダーも対応していませんし)、修正するごとに記述を追加していきたいと思います。

コメントを投稿する