Smarty で default_modifiers に escape:html を設定すると、出力時にエスケープ処理をしてくれるので便利…だけど副作用があってちょっと困った話。
Smarty を使う際に
$smarty = new MySmarty(); $smarty->default_modifiers = array('escape:"html"');
とかやっておくと、< とか > とかを自動でエスケープしてくれるので便利なんだけど、
{foreach from=$smarty.session.arr key="key" item="item" name="list"} {if $smarty.foreach.list.first}<div class="foo">{/if} <p>{$item}</p> {if $smarty.foreach.list.last}</div>{/if} {/foreach}
とか書いたときに $smarty.session.arr が空でも div と p が出力されてしまいます。どうやら smarty/libs/plugins/modifier.escape.php 内の処理が関係していて、NULL が入ってきても htmlspecialchars() で処理して空文字を返してしまうことで上記の副作用が発生するようです。しかも $_SESSION を使ってるときだけっぽい?…どのタイミングで処理されてそうなってしまうのか不明。多分出力時なんだろなぁ…。
あと、多次元配列を foreach の from に設定するとエラーが出てしまうのも問題。
ということで、modifier.escape.php を以下のようにやっつけ修正。(白目
if (is_array($string) or is_null($string)) return $string; switch ($esc_type) { case 'html': return htmlspecialchars($string, ENT_QUOTES, $char_set);
Smarty のバージョンアップの際には気を付けよう…。