Smartyのテンプレート関数 assign
Smartyのテンプレート関数 assign について、配列をアサインできない仕様を、ずっと以前から不便に感じていた。
通常、assign関数はこんな風に使うけど、
{assign var='a' value='hoge'} {assign var='b' value='fuga'} <html><body> <p>{$a}</p> <p>{$b}</p> </body></html>
それをこんな風にも使えれば、便利ではないかと。
{assign var='array.a' value='hoge'} {assign var='array.b' value='fuga'} {assign var='array.c.1' value='foo'} <html><body> <p>{$array.a}</p> <p>{$array.b}</p> <p>{$array.c.1}</p> </body></html>
該当するコードは plugins/compiler.assign.php とわかった。
このファイルではファイル名通り、 smarty_compiler_assign 関数を実装している。
この関数をこんな風に書き換えてみたら、希望通りの動作を実現できた。
<?php function smarty_compiler_assign ($params, &$compiler) { $params = $compiler->_parse_attrs($params); if (!isset($params['var'])) { $compiler->_syntax_error('assign: varが未定義です。', E_USER_WARNING); return; } if (!isset($params['value'])) { $compiler->_syntax_error('assign: valueが未定義です。', E_USER_WARNING); return; } $var = null; foreach (explode('.', str_replace('.', "'.'", $params['var'])) as $part) { if ($part == "''") { $var .= '[]'; } else { $var .= '[' . $part . ']'; } } return '$this->_tpl_vars' . $var . '=' . $params['value'] . ';'; }
本来テンプレートに書くべき...と思われる内容を、仕方なくphp側に書いたりしてたけど、一掃できてうれしい。
それにしても、このアイデアをもっと早く気づけなかったものか。