日記
Zend_View_Smartyを作ってみたEdit

Zend_ViewをSmarty対応するためのZend_View_Smartyを作ってみた。

ただし、「Zend Frameworkをどう使うか その8」でぐだぐだ書いたとおり、現在(Zend Framework 0.1.2)のZend_View_Abstractの実装では、Viewの値を保持する変数である$_varsに、継承したクラスからアクセスできない。

そこで、Zend_View_Abstractを以下のように書き換えて使っている。

-    private $_vars = array();
+    protected $_vars = array();

Zend_View_Smartyを使うと、呼び出し側のコードは、

$config = array(
'scriptPath' => '/path/to/views', // for Zend_View
'compile_dir' => '/path/to/templates_c', // for Smarty
);
$view = new Zend_View_Smarty($config);
$view->foo = 'FOO';
$view->now = time();
echo $view->render('template.tpl');

というように、通常のZend_Viewを使った場合と同様に書ける。一方呼び出されるテンプレートファイルtemplate.tplは、

<p>foo is {$foo|escape}.</p>
<p>now is {$now|date_format:'%D %T'}

なんてSmarty記法を使って書ける。

Smartyのキャッシュ機構を使いたい場合は、以下のようになる。

$config = array(
'scriptPath' => '/path/to/views', // for Zend_View
'compile_dir' => '/path/to/templates_c', // for Smarty
'cache_dir' => '/path/to/cache', // for Smarty
);
$view = new Zend_View_Smarty($config);
$view->getSmarty()->caching = true;
if (!$view->isCached('template.tpl')) {
$view->foo = 'FOO';
$view->now = time();
}
echo $view->render('template.tpl');

キャッシュ制御にcache_idやcompile_idを使いたい場合は、isCachedやrenderの引数として渡すのではなく、$view->setCacheId('[CACHE_ID]')や$view->setCompileId('[COMPILE_ID]')などのセッタメソッドを使って、あらかじめViewオブジェクトにセットする。あと上記サンプルコードにもあるけれども、$view->getSmarty()でViewの内部にもつSmartyオブジェクトにアクセスできるんで、Smartyに関する細かい制御を行いたい場合は、それ経由で行えばいい。

また、SmartyからZend_Viewの機能にアクセスするためのSmarty用のプラグインも作ってみた。helperプラグインは、

{helper name="[HELPER NAME]" params....}

という記法で、Zend_Viewのhelper機能を呼び出すことができる。また、renderプラグインは、

{render file="[TEMPLATE_FILE]"}

という記法で、Zend_Viewのrenderメソッドを呼び出すことができる。

Smartyにも標準でincludeのような外部テンプレートを呼び出す機能は用意されているが、SmartyのincludeだとSmartyオブジェクトのtemplate_dirをベースにテンプレートファイルが検索されることになる。一方Zend_View::renderではaddScriptPathなどによる複数ディレクトリからのテンプレートファイル検索が行われるので、テンプレートファイルのパスの問題を一元化するために、renderプラグインを経由した方がいい。

といった感じで、Zend_Viewのインターフェースや機能を一通り使いつつも、Smartyの機能も一通り使えるようなViewクラスを作ってみたわけだけれども、実際問題Zend Framework 0.1.2の実装ではこういう書き方はできないわけで、できればその辺を何とかしてもらいたい。もうちょっといろいろ試してみてから、MLにでもその辺の話を投げてみよう。誰か代わりに投げてもらってもいいです。英語で書くのめんどい。

MLに投げた

いい反応があるとうれしいんだけど。

Published At2006-03-23 00:00Updated At2006-03-23 00:00