Smartyでは変数の出力時に簡単にフィルタをかけることができます。
これらは修正子と呼ばれています。
{$str|escape}
と書くと、$strにhtmlspecialchars()が適用された上で表示されます。
他に{$str|nl2br}
とすると変数内の改行が<br />に、
{$str|replace:'a':'b'}
とすると$str中の'a'が'b'に置換されて表示されます。
引数がある場合は:で区切って指定します。
また、複数の修正子を|で連結させて適用することもできます。
{$str|upper|lower}
とすると、$strを大文字に変更し、その後小文字に変更して表示します(結局小文字になる)
それ以外にも、何気にマニュアルに書かれているとおり、すべてのPHP関数を修正子として利用できます。
{$str|substr:5:3}
とするとsubstr($str,5,3)と同じ意味になります。
この場合第一引数が$str、substrの後ろが順に第二以降の引数という解釈になります。
というわけでこれを使用して、
$smarty->assign('yesterday',time()-60*60*24);
{'Y-m-d H:i:s'|date:$yesterday}
みたいな書き方もできたりします。
このような書き方は結構知られてないような気がします。
まあ普通は
{$yesterday|date_format:"%Y-%m-%d %H:%M:%S"}
としますけれども。
どうでもいいがdate_formatって名前なのにstrftimeの解釈をするのはどうなんだ。
さて、XSS対策に毎回エスケープかけるのは面倒臭い、という場合のためにデフォルトでエスケープする、というオプションがあります。
$smarty->default_modifiers=array('escape:html');
これをSmarty.phpに書いてみましょう。
この場合、出力は常にエスケープされて表示され、例外的にエスケープしたくない場合に
{$str|smarty:nodefaults}
というふうにするとエスケープせずにそのまま表示することができます。
基本的にこのオプションを使うほうが安全ですが、明示的に:escapeした方が明らかにエスケープしたとわかりやすいですし、そこは場合によると言うことで。
古いSmartyにはdefault_modifiersを指定すると配列が使えなくなるというバグがあったようですが、2.6.22では修正されているようです。