Smartyテンプレート内でオブジェクトが使える件
Smartyの テンプレート内でオブジェクトが使えるというのは、 知識としては知っていたんだけど (変数)、 うまい使いかたしたらうまくないか、という話。
Webサイトで、 いくつかのページに「ようこそ○○さん。今日のラッキーカラーは○○です」 とか入れようとすると、 ロジックの側で
$fortune = new Fortune($userid);
$smarty->assign('lockyColor', $fortune->lockyColor());
みたいなことをして、テンプレートで
ようこそ{$nickname|escape}さん。
今日のラッキーカラーは{$lockyColor|escape}です
と表示すると、とりあえず楽なんだけど、困ったことがあって、 ラッキーカラーをどのページで表示するのかを ロジックとテンプレートの両方が把握していないといけないです。 こことここだけ表示する、と決めておいて、 そこのロジックに上のコードを差し込むとすると、 最初はそれでいいのだけど、増減があったときに2箇所修正しないといけない。 どのページにも表示できるということにして、 共有の変数を設定する関数に差し込むとすると、 表示しないページではlockyColor()を実行させるコストが無駄になります。 んで、困ったと。
プラグイン関数を使うと
ようこそ{$nickname|escape}さん。
今日のラッキーカラーは{lockyColor|escape userid=$userid}です
こんな感じだけど、関数が増えると管理しきれなくなりそう (あと語順がなんか妙な気がする)。
んで、調べていたところ、 テンプレート内でオブジェクトが使えるという知識と、 この件が結びついたんですね。 こうすればよかった。
$smarty->assign('fortune', new Fortune($userid));
ようこそ{$nickname|escape}さん。
今日のラッキーカラーは{$fortune->lockyColor()|escape}です
そういや 「イテレータの使いどころ」 ではイテレータを使うのがレアケースだと思ってたんだけど、 「CSVを読んで各行を返すイテレータ」を用意しておけば、 そのイテレータを使うクラスのテストケースは、 CSVファイルの替わりに配列が使えてハッピーだったり。