Smartyインスタンスをvar_dump()するとわかりますが、Smarty::assignした変数はSmarty::_tpl_varsに入っています。
で、Smarty::_tpl_varsはPHP4互換のためvarで宣言されているので外部から書き換えが可能です。
さて、これで何が便利かというとテンプレート内から配列にアサインしたい場合です。
テンプレート内で変数をアサインすることができます。
{assign var='title' value='hoge'}
{$title}
とすると$titleで'hoge'を表示することができます。
ところがこの{assign}、実は配列をアサインすることができません。
そんな場合に{assign}が覗いている先を直接書き換えてしまいます。
{php}
$this->_tpl_vars['aaaa'] = array('aa'=>'hoge','bb'=>'fuga');
{/php}
これで{$aaaa.aa}で'hoge'を表示することができるようになりました。
まあ、そもそもテンプレート内で配列をアサインするような設計になっている時点でどこかがおかしいんですがね。
ここで出てくる{php}ですが、これは{php}{/php}で挟まれた部分をPHPとして解釈するという極めて危険な関数です。
これを使用した時点でSmartyの役目が台無しです。
というわけで、$smarty->security=true;とすると使用を禁止することができます。
これで安全といえば安全なのですが、同時にPHP関数の修正子も使用できなくなってしまいます。
使用できるのはpluginsフォルダに入っている、カスタム修正子を含めた修正子だけとなります。
{$text|substr:5:10}とかも使えなくなってしまうのが少々困りもの。
{php}だけ禁止して他はおっけーとかの設定はできんものかのう。