blog.fuktommy.com

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ファイルの替わりに配列が使えてハッピーだったり。

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