2006年02月11日

表(行)を表示するには?

しばらく、脱線ネタで日を稼いでましたが、続きです。

表示する項目が多い場合、連想配列を使うと便利です。というのは、前回の話で、今回は、表の行のような、繰り返し表示する方法です。
このような場合は、出力が何行になるか?は分かりません。データベースを読んで初めてわかるものです。なので、最初からテンプレートに

{$member.name1}
{$member.name2}
{$member.name3}

とは書けません。

テンプレートには、PHPプログラムからの値を表示するだけでなく、いわゆる制御構造をいうモノを持っています。

なんですか?それ?

プログラムの世界は、「順番に実行する」「繰り返す」「分岐する」といった基本的な処理の組み合わせです。この基本的な処理のことを制御構造と言います(厳密には違うのかな…)。

つまり、Smartyのテンプレートには、この制御構造、言ってしまえば、簡単なプログラムが書けます。
これが、ホントに便利なところでもあるし、使い方を間違ったら、ドンくさいことをしてしまいそうなモノです。

繰り返しで表示するには、次のようにします。

まず、簡単なデータファイル(data.txt)を次のように作ります。

1,矢口真里,女
2,田中太郎,男
3,木村花子,女
4,高橋涼介,男

もっと増やしても構いません。
やることは、このファイルを読み込んで表示するので、ここに書いた分だけ表示されることになります。

次にこれを読み込んでSmartyで表示するプログラム(list.php)を作ります。

<?
require_once "libs/Smarty.class.php";
$i = 0;
$fp = fopen("data.txt", "r");
while ($data = fgetcsv($fp, 1000, ",")) {
	$list[$i]['id'] = $data[0];
	$list[$i]['name'] = $data[1];
	$list[$i]['sex'] = $data[2];
	$i++;
}
fclose($fp);
$smarty = new Smarty;
$smarty->clear_cache('list.html');
$smarty->assign("list",$list);
$smarty->display('list.html');
?>

前回は $member['id'] とかいう連想配列に値を入れてましたが、今回は $list[$i]['id'] とかのように、もう1回配列にします。読み込んだデータ数だけ連想配列の配列に入れてやります。そうして、listという名前でテンプレートに渡しています($smarty->assign("list",$list);)。

次にテンプレートのほうです。

<html>
<head>
<title>smarty test リスト</title>
</head>
<body>
<table>
<tr>
<th>会員番号</th>
<th>名前</th>
<th>性別</th>
</tr>
{foreach item=row from=$list}
<tr>
<td>{$row.id}</td>
<td>{$row.name}</td>
<td>{$row.sex}</td>
</tr>
{/foreach}
</table>
</body>
</html>

ポイントは {foreach item=row from=$list} の部分です。この {foreach・・・} から {/foreach} までが繰り返されます。繰り返す回数は、$list に入っている数だけ。つまり、PHPプログラムで、データファイルから読み込んだデータ数です。

{foreach item=row from=$list}
は、$listのデータの1行分を row という名前で扱います。なので、繰り返しの中では、$rowという名前を使います。後は連想配列を同じように、$row.id、$row.name、$row.sex という風に書きます。
これで、結果的にデータファイルの内容を表示できます。

row は、PHPの変数名 list と同じ名前でもいいようです。

{foreach item=list from=$list}
<tr>
<td>{$list.id}</td>
<td>{$list.name}</td>
<td>{$list.sex}</td>
</tr>
{/foreach}

こうして統一しておくと、わかりやすいと思います。

この、連想配列でのデータの渡し方と、テンプレートの繰り返しがあれば、結構、なんでも作れます。ほとんどのページに対応できます。

テンプレートには、もっともっと、機能がわんさかとあります。
このあたりを駆使すると、今までPHPプログラムでやっていたことをテンプレート側でできます。と、なると、PHPプログラムがもっともっとすっきりしてきます。
データファイル(とかデータベース)を読んで、表示するデータをSmartyに渡すだけ!といった処理に収まります。PHPプログラムのほうもすっきりします。

今まで、強引にすべてをPHPプログラムに書いていたので、もう、ぐしゃぐしゃ状態ですが、これにより、PHPプログラムはデータの処理だけ、テンプレートは表示だけといった、分離がきれいにできるのです。

2006年02月11日 17:47 |  3.使い方


トラックバック

このエントリーのトラックバックURL:

このリストは、次のエントリーを参照しています: 表(行)を表示するには?:

» ykt_付箋(URL) from [hinami.net:PukiWiki Plus!] (PukiWiki/TrackBack 0.4)
ykt_付箋(URL)  見つけた記事をさっくり保存しておく場所 巡回所(あとで編集する) U... [続きを読む]

トラックバック時刻: 2006年10月19日 20:36

コメント

コメントしてください




保存しますか?