blog.fuktommy.com

Smartyテンプレート+オブジェクト(まとめ)

Smartyテンプレート内でオブジェクトが使える件」と「Smartyテンプレート+オブジェクト(バッドノウハウ編)」のまとめ。

標語的にいえば、Smartyにassignする変数は、 各アクションコントローラで設定する場合であっても、 あとから共通変数にできるようにしておこうということになります。

具体的には、名前を階層化させることで、テンプレートを読みやすくすることと、 値を出すのに時間のかかるものは、 テンプレートから呼ばれたときに値を出すようにする (あるいは、あとからそう変更できるようにする)ことです。 その両方をできるようにするために、

$fortune = new Fortune($user);  // いろんな占いのできるクラス
$smarty->assign('luckyColor', $fortune->getLucyColor());
$smarty->assign('luckyItem',  $fortune->getLucyItem());
{$luckyColor}, {$luckyItem}

$smarty->assign('fortune', new Fortune($user));
{$fortune->luckyColor}, {$fortune->luckyItem}

と書くと。 それから、副作用のあるアクション(投稿とかユーザ登録とか)の中身は、 共通変数にはならないだろうけれども、 名前の階層化のことも考えると

$article = new Article($user, $text);
$article->post();
$smarty->assign('article', $article);
if ($article->sucess()) {
    $smarty->display('done.tpl');
} else {
    $smarty->display('error.tpl');
}
{$article->text}

とかしておいいた方がよい気がする。 よくわからないのがクエリ引数とかで微妙に挙動を変えるもので、

$smarty->assign('astrology', new Astrology($_REQUEST['sign']);
{$astrology->sign|escape}座のラッキカラーは{$fortune->luckyColor|escape}です。

みたいに、signにどの星座を入れるかで表示を変えるページがあったとすると、 これは共通変数にはならないはずだよなあと思うのだけど、 もし共通変数になるとしたら、 テンプレート側から引数を指定して値を取る場面も出てくるのかな。 そのあたりはプラグイン関数で吸収するべきか。

Copyright© 1998-2014 Fuktommy. All Rights Reserved.
webmaster@fuktommy.com (Legal Notices)