dポイントプレゼントキャンペーン実施中!

Smartyで、配列であった場合に、implodeで結合させるプラグインを作りたいのですが、思うように動作しません。

テンプレート内で、次のように記述しています。
{foreach from=$value item=i}
 {$i->note|ketugou}
{/foreach}

ketugouプラグインでは次の通りです。

function smarty_modifier_ketugou($key){
if (is_array($key)) {
return implode(', ', $key);
} else {
return $key;
}
}

上記の場合、表示されるのは'Array'のみです。

プラグインで配列かどうかを確認せずに実行すると、次のエラーが出ます。

Warning: implode() [function.implode]: Bad arguments. in。。。

テンプレート上では配列であったのが、プラグインに渡すと配列ではなく、stringとなっていて要素数分実行されています。プラグインからのエラーは配列じゃないからなのですが、どう対処すればいいのでしょうか。

A 回答 (2件)

配列全体を1つの値として作用させるには修飾子の先頭に @ 記号をつける必要があります。


{$i->note|@ketugou}

Smartyの動きが不明な時はコンパイル済みファイルを見ると多少進展します。

参考URL:http://www.smarty.net/manual/ja/language.modifie …
    • good
    • 0
この回答へのお礼

ありがとうございます。おかげさまで解決しました。マニュアルをちゃんと読んでいませんでしたね。

お礼日時:2008/01/21 20:38

>function smarty_modifier_ketugou($key){


>if (is_array($key)) {

echo "通過1\n";
var_dump($key);

>return implode(', ', $key);
>} else {

echo "通過2\n";
var_dump($key);

>return $key;
>}
>}
として、まずこの関数を通過しているのか確かめてみては?

この回答への補足

早速の回答ありがとうございます。

smarty_modifier_ketugou関数に値を送ることはできています。が、配列をおくっているはずが、配列の中身が個別に送られてしまっているのです。テンプレートの時点では配列だったものが、関数には配列の要素が送られているため、その時点ではarrayではなくstring(これはgettype関数で確認しました。)です。

 stringなら関数内でis_arrayとやっても反応しません。当然そのままimplodeやっても配列ではないので『Warning: implode() [function.implode]: Bad arguments. in。。。』となるようです。

補足日時:2008/01/21 20:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!