no smarty
たまにはプログラムのことを書いてみる。
phpでSmartyを使うほどでもないけどロジックによってはテンプレートの出し分けしたいなーっていう場合に自分はこんな関数を使ってます。
呼び出し側はこんな感じ
で、テンプレートはそれぞれこんな感じ。
hoge.tpl
fuga.tpl
パフォーマンス優先で機能はあんまりいらない、かつテンプレートの見た目が多少ごちゃついてもいい場合はこんなのでも良いのではと思います。
追記:
テンプレートにバインドする変数が無い時の対応がなかったので
display関数の第2引数のデフォルトを null にした。
それにともない null の時はextractしないように修正。
あとパフォーマンスとかいいつつちゃんとベンチとっていなかったので pear/Benchmark を使ってSmartyと比較してみた。
詳細は手元に無いので書けないんだけど、
上記の関数を使った場合を1とすると・・・
Smarty使用の1回目はキャッシュが生成されてないのでだいたい30倍くらいで、
2回目以降はキャッシュが聞いてるので3倍くらいだった。
適当にやっただけなのであくまで参考値だけどとりあえず遅くなくてよかった。
phpでSmartyを使うほどでもないけどロジックによってはテンプレートの出し分けしたいなーっていう場合に自分はこんな関数を使ってます。
function display( $tpl, $tpl_vars = null ) { if ( defined('DEFAULT_TEMPLATE_DIR') ) { if ( substr(DEFAULT_TEMPLATE_DIR, -1) !== DIRECTORY_SEPARATOR ) { $tpl = DEFAULT_TEMPLATE_DIR . DIRECTORY_SEPARATOR . $tpl; } else { $tpl = DEFAULT_TEMPLATE_DIR . $tpl; } } if ( ! file_exists($tpl) ) { trigger_error("'$tpl' is not found", E_USER_ERROR); } if ( $tpl_vars !== null ) { extract($tpl_vars); } include($tpl); exit; }
呼び出し側はこんな感じ
if ( $isHoge ) { display('hoge.tpl', array('msg' => 'hoge')); } else { display('fuga.tpl', array('msg' => 'fuga', 'msg2' => 'foobar')); }
で、テンプレートはそれぞれこんな感じ。
hoge.tpl
<html> <head> <title>hoge.tpl</title> </head> <body> <h1>Hello <?php echo $msg ?> world.</h1> </body> </html>
fuga.tpl
<html> <head> <title>fuga.tpl</title> </head> <body> <h1>Hello <?php echo $msg ?> world.</h1> <h2><?php echo $msg2 ?></h2> </body> </html>
パフォーマンス優先で機能はあんまりいらない、かつテンプレートの見た目が多少ごちゃついてもいい場合はこんなのでも良いのではと思います。
追記:
テンプレートにバインドする変数が無い時の対応がなかったので
display関数の第2引数のデフォルトを null にした。
それにともない null の時はextractしないように修正。
あとパフォーマンスとかいいつつちゃんとベンチとっていなかったので pear/Benchmark を使ってSmartyと比較してみた。
詳細は手元に無いので書けないんだけど、
上記の関数を使った場合を1とすると・・・
Smarty使用の1回目はキャッシュが生成されてないのでだいたい30倍くらいで、
2回目以降はキャッシュが聞いてるので3倍くらいだった。
適当にやっただけなのであくまで参考値だけどとりあえず遅くなくてよかった。