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側に書いたりしてたけど、一掃できてうれしい。
それにしても、このアイデアをもっと早く気づけなかったものか。