テンプレートエンジンSmartyで、割り当てられた変数(配列)を分割するための関数を作ったのでメモ。
例えばリンク集(バナーで表示)を作るって表形式で表示したい場合、表の列数によってテンプレート内で「行の開始かどうか(<tr>タグを出力するかどうか)」「行の終了かどうか(</tr>タグを出力するかどうか)」といったロジックを書くことになる。テンプレート内でのロジックは減らしたいので、上記のように書くのはあまり好きではない。
PHPには便利な関数array_chunkというのがある。配列を指定した個数の配列に分割してくれるというものだ。さらに便利な関数でarray_padというのがある。指定個数に満たない配列を、指定した値で満たしてくれる関数だ。
一番簡単なのはコントローラ(もしくはメイン処理)で、上記の処理を入れることだが、表示を変更したい(例えば表の列数を増減したい)場合は、コントローラのプログラムを変更しなければならず、本来表示側だけで対応したいのに、本末転倒となるわけだ。
んで、Smartyの関数を作って、テンプレート内で分割できるようにした。関数はfunction.array_split.phpという名前で、以下の内容で、しかるべき場所に保存。
<?php
function smarty_function_array_split($params, &$smarty)
{
$paramKey =$params[‘var’];
$paramValue =$params[‘value’];
if(is_null($paramValue)){
$paramValue=array();
}
$paramSplit =$params[‘split’];
if($paramValue){
$paramSplitted=array_chunk($paramValue,$paramSplit,true);
$lastValue=array_pop($paramSplitted);
$lastValue=array_pad($lastValue,$paramSplit,NULL);
array_push($paramSplitted,$lastValue);
}else{
$paramSplitted=array();
}
$smarty->assign($paramKey,$paramSplitted);
}
もうちょっとエラー処理を入れなくてはいけないけれど・・・。
もっと早くに関数作ればよかったな。