Smartyコンパイラのカスタマイズ

Smartyのデフォルト修飾子を指定していて、{if}でPHPの関数を呼ぶとエラーになる場合があります。

{if isset($data)}dataがあるときだけ出す{/if}

これを回避するため、Smartyのコンパイラを継承し、_compile_if_tag メソッドをオーバーライドしました。

同メソッド中、_parse_var_props を呼んでいる箇所が1か所あるので独自のメソッドを呼び出すよう修正しました。

   :
//$token = $this->_parse_var_props($token);
$token = $this->_parse_var_props_without_default_modifiers($token);
   :

独自のメソッドは、_parse_var_props をコピーして作成しデフォルト修飾子の部分だけコメントアウトすればOK。

   :
//if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) {
//    $_default_mod_string = implode('|',(array)$this->default_modifiers);
//    $modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers;
//}
   :

あとはSmartyをnewした後に新しいコンパイラのパス、クラス名を指定します。

$smarty = new Smarty();
$smarty->compiler_file = '継承したコンパイラクラスのパス';
$smarty->compiler_class = '継承したコンパイラクラス名';

そもそも、if 文の条件式にまでデフォルト修飾子がかかるとは驚きでした。