PHPプロ!TIPS+

Smartyのmodifierを使いこなそう

みなさんSmartyは使ってますか?今回はSmartyを使ってる方に送るTIPSです。

Smartyでは modifier という機能があります。知ってる方も多いでしょうが、これはSmartyにassignされた変数をイジるためのものです。 PHPに用意されている関数をパイプ「|」でつなげるだけで使用することができます。

たとえば、

$smarty->assign('name', 'atsushi');

とスクリプト内で変数をアサインしておき、

{$name} {$name|strtoupper}

とテンプレートに記述すると

atsushi ATSUSHI

とこんなふうに表示されます。

1. modifierに配列を渡す

ここで、こんな配列をアサインしてみます。

$name_list = array(
    '0' => 'atsushi',
    '1' => 'yoshiki',
    '2' => 'miwa',
    '3' => 'hiroshi',
    '4' => 'saito'
);
$smarty->assign('name_list', $name_list);

この配列の要素数をcount関数を使って表示してみましょう。

{$name_list|count} → Array

すると、配列の要素数は表示されず、表示は「Array」となっています。これはmodifierでは値を一つの変数としてしか渡せないためです。そのため、配列を文字列表示したときの「Array」が表示されてしまうのです。これが表示されて悩んだ方も多いのではないのでしょうか。

もちろんSmartyにはmodifierに配列を渡す方法も用意されています。その方法は関数名の前に「@」をつけるだけです。

{$name_list|@count} → 5

これでキチンと表示されるようになりました。

これを利用するとこんなこともできます。

この配列に何入ってたっけ・・・?値入ってんのかな・・・?というときに

{$name_list|@print_r}

を使用すると、

Array
(
    [0] => atsushi
    [1] => yoshiki
    [2] => miwa
    [3] => hiroshi
    [4] => saito
    [5] => masahiro
) 1

こんな感じに表示されます。これを使うとテンプレート編集中のデバッグがとても楽になります。

ここで、最後に表示した覚えのない「1」が表示されていますが、これはいったい何なのでしょう。これは以下のスクリプトを実行すると理解できると思います。

echo print_r($name_list);

print_r関数が返す「1」が表示されているようです。

これを繰り返し使うこともできます。

・配列のキーと値を入れ替えて表示

{{$name_list|@array_flip|@print_r}}
→ Array
(
    [atsushi] => 0
    [yoshiki] => 1
    [miwa] => 2
    [hiroshi] => 3
    [saito] => 4
) 1

なんの意味もないスクリプトですが、こんなこともできる、程度に覚えておくといいかもしれません。

2. modifierにウマく変数を渡す

modifierには「:」をつけることで引数を渡すこともできます。たとえばこんな感じです。

{$name|substr:'1':'3'} → tsu

では、今度はstr_replaceを使って文字列の置換を行ってみましょう。'atsushi'の'shi'を'ko'に変えてみたいと思います。

{$name|str_replace:'shi':'ko'}} → ko

思ったとおりの文字列が表示されません。

modifierでは、パイプの前の変数とコロンの後に指定した値が、並べた順番にそのまま関数に渡されます。上記の例は、str_replace($name, 'shi', 'ko'); の結果を表示しようとしてしまっているのですが、ここで表示したいのは str_replace('shi', 'ko', $name); の結果なのです。

これを解決するには、このままの順番でmodifierを書いちゃえばいいのです。

{'shi'|str_replace:'ko':$name} → atsuko

トリッキーな記述方法になりますがこれで文字列の置換が実行できます。同じように、3番目の引数に文字列を指定するpreg_replaceなどでも同様の処理ができます。

{'/a|i|s/'|preg_replace:'!':$name} → !t!u!h!

3. 応用編

上の二つの方法を使うとこんなアホな技も使えます。

・配列の各要素を大文字に変換して出力

{"strtoupper"|@array_map:$name_list|@print_r}
→Array
(
    [0] => ATSUSHI
    [1] => YOSHIKI
    [2] => MIWA
    [3] => HIROSHI
    [4] => SAITO
) 1

なにがなんだかわかりません。そもそも使い道がありませんが、混乱するのでくれぐれも実践では使わないでください。また、最後になりますが、Smartyの変数はなるべくロジックで編集してからアサインするようにしましょう。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)