Smartyのテンプレートで配列や連想配列を定義する方法

Smartyのテンプレートでは配列や連想配列を定義できない。そんな風に考えていた時期が俺にもありました。

さてググってみるとプラグインを利用する方法を発見しました。

前者は自作プラグインを作る方法、後者はsplitプラグインを利用する方法ですね。

しかしプラグインを利用する方法には以下の三つの問題点があります。

  1. 文字列の配列しか生成できない
  2. 多次元配列を生成できない
  3. メソッドに引数にそのまま渡せない

あくまで文字列を分割して配列を生成してるだけなのでオブジェクトの配列や多次元配列を生成できません。

またメソッドに渡せないというのは以下のようなケース

エラー。メソッドの引数にプラグインを使用できない
{$foo->bar(','|split:'a,b,c')}

一旦一時変数に入れないと渡せない。
{assign var='hoge' value=','|split:'a,b,c')}
{$foo->bar($hoge)}

さてこれらの問題を超無理やり解決するために僕が考えた方法はこれ。

<?php
class SmartyUtil {
    function ary () {
        $param = func_get_args();
        return $param;
    }
}

$smarty->assign('u',new SmartyUtil);
$smarty->display('test.tpl');

テンプレート側はこう。

{$u->ary('a','b')}

Smartyに常に渡すユーティリティクラスを用意しておいて、そこにaryというメソッドを用意しておく。

aryの実装は引数をそのまま配列にして返すだけのシンプルなもの。

これで文字でもオブジェクトでも何でも配列化が可能となる。

またメソッド呼び出しはネストが可能なので多次元配列も簡単に作れる

{$u->ary($u->ary('a','b'),$u->ary('c','d'))}

お次は連想配列。これもaryと同じく、ユーティリティクラスにメソッドを追加する。

<?php
class SmartyUtil {
    function ary_assoc () {
        $ret = array();
        $param = func_get_args();
        $count = count($param);
        if ($count  % 2 ) $param []= null;
        for($i=0;$i<$count;$i+=2) $ret[$param[$i]] = $param[$i+1];
        return $ret;
    }
}
{$u->ary_assoc('A','1','B','2')}

お後がよろしいようで。