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 文の条件式にまでデフォルト修飾子がかかるとは驚きでした。


