2010年3月10日水曜日

Smarty3でエスケープをデフォルトにする方法

Smarty2では$default_modifiers でもバグがあった模様

//smarty側
$this->default_modifiers = array('escape:"htmlall");

//テンプレート側
{$escaped} //エスケープされる
{$unescaped|smarty:nodefaults} //エスケープされない

どういったバグがあるかについては、Smartyのバグ ~default_modifiers~が参考になります。再帰処理はSmarty2でdefault_modifiersを使いたくなったら書こうかな。でも基本的にスカラの時だけエスケープすればいいと思うので、配列の時は何もしないってのがいいと思います。

Smarty3ではvariableFilter(関数名)

マニュアル読んでないし(まだ出てない?)、ソースも全然読んでないのでひょっとしたら公式なやり方じゃないかもしれない....けど、これで動きます。

//Smarty側
$this->register->variableFilter('escape');
//フィルター関数
function escape($string, $smarty){
  return is_string($string) ? htmlentities($string, ENT_QUOTES,  SMARTY_RESOURCE_CHAR_SET) : $string;
}

//テンプレート側
{$escaped} //エスケープされます
{$unescaped nofilter} //エスケープされません

ちなみにSmarty3.0b8で試しました。バグはどこかに残ってるはずだけど、Smarty2より2〜5倍速いようです。ほぼ完成してるらしいので、早く安定版出してほしいな〜!

ちゃんとやるなら? loadFilter('variable', 関数名);で定義してる関数を読み込んで、variableFilter(関数名)とするのがいいのかもしれません。

0 件のコメント: