<{section}> は、データの配列 をループするために使用します。これは、<{foreach}> が 1 つの連想配列 をループするのとは異な ります。すべての <{section}> タグは、終了タグ <{/section}> とペアになっている必要があります。
| 属性名 | 型 | 必須 | デフォルト | 概要 |
| name | string | Yes | n/a | セクション名 |
| loop | mixed | Yes | n/a | ループ回数を決定する値 |
| start | integer | No | 0 | ループを開始するインデックス位置。負の値は指定できません。ループ配列の長さを超えるような無効な値は、自動的に最も近い値に切り捨てられます。 |
| step | integer | No | 1 | ループインデックスを進めるために使われるステップ値。例えば step=2 なら、インデックスは 0, 2, 4 をループします。負の値は指定できません。 |
PHP や C、Java などの言語の for ループに慣れている方には、馴染みにくい構文ですが、name 属性はループ変数の変数名と考えると理解の一助になるかもしれません。実際コンパイル後のテンプレートファイルを読むと、section は for 文に展開し、name 属性に指定したループ変数でループしていることに気づくと思います。
配列を Simplate に assign() します。
<?php
$data = array(1000, 1001, 1002);
$simplate->assign('custid', $data);
?>
配列を出力するテンプレート
<{* この例は $custid 配列のすべての値を表示します *}>
<{section name=customer loop=$custid}>
id: <{$custid[customer]}><br />
<{/section}>
上の例の出力
id: 1000<br /> id: 1001<br /> id: 1002<br />
<{section}> の name は自由につけることができます。PHP の変数 を参照してください。これは、<{section}> 内のデータを参照する際 に使用します。
<{section name=anything loop=$myArray}>
<{$myArray[anything].foo}>
<{$name[anything]}>
<{$address[anything].bar}>
<{/section}>
これは、データの連想配列を <{section}> で出力する例です。次に示すのは、配列 $contacts を Simplate に渡す PHP スクリプトです。
<?php
$data = array(
array('name' => 'Taro Yamada', 'home' => '555-555-5555',
'cell' => '666-555-5555', 'email' => 'yamada@simplate.com'),
array('name' => 'Hanako Tanaka', 'home' => '777-555-5555',
'cell' => '888-555-5555', 'email' => 'tanaka@simplate.com'),
array('name' => 'Ichiro Suzuki', 'home' => '000-555-5555',
'cell' => '123456', 'email' => 'suzuki@simplate.com')
);
$simplate->assign('contacts',$data);
?>
$contacts を出力するテンプレート
<{section name=customer loop=$contacts}>
<p>
name: <{$contacts[customer].name}><br />
home: <{$contacts[customer].home}><br />
cell: <{$contacts[customer].cell}><br />
e-mail: <{$contacts[customer].email}><br />
</p>
<{/section}>
上の例の出力
<p> name: Taro Yamada<br /> home: 555-555-5555<br /> cell: 666-555-5555<br /> e-mail: yamada@simplate.com<br /> </p> <p> name: Hanako Tanaka<br /> home: 777-555-5555<br /> cell: 888-555-5555<br /> e-mail: tanaka@simplate.com<br /> </p> <p> name: Ichiro Suzuki<br /> home: 000-555-5555<br /> cell: 123456<br /> e-mail: suzuki@simplate.com<br /> </p>
この例では、$custid、$name および $address にはすべて配列が割り当てられ、その要素数は同じであるものとします。まず、Simplate に配列を割り当てる PHP スクリプトです。
<?php
$id = array(1000, 1001, 1002);
$fullnames = array('Taro Yamada', 'Hanako Tanaka', 'Ichiro Suzuki');
$addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
$simplate->assign('custid', $id);
$simplate->assign('name', $fullnames);
$simplate->assign('address', $addr);
?>
loop 変数は、ループの回数を決定するためにのみ使用します。<{section}> 内ではあらゆるテンプレート変数にアクセス可能です。
<{section name=customer loop=$custid}>
<p>
id: <{$custid[customer]}><br />
name: <{$name[customer]}><br />
address: <{$address[customer]}><br />
</p>
<{/section}>
上の例の出力
<p> id: 1000<br /> name: Taro Yamada<br /> address: 253 Abbey road<br /> </p> <p> id: 1001<br /> name: Hanako Tanaka<br /> address: 417 Mulberry ln<br /> </p> <p> id: 1002<br /> name: Ichiro Suzuki<br /> address: 5605 apple st<br /> </p>
<{section}> は無制限にネスト可能です。<{section}> をネストすることで、 多次元配列のような複雑なデータ構造にアクセスすることが可能です。これは、配列を割り当てる PHP スクリプトの例です。
<?php
$id = array(1001, 1002, 1003);
$simplate->assign('custid', $id);
$fullnames = array('Taro Yamada', 'Hanako Tanaka', 'Ichiro Suzuki');
$simplate->assign('name', $fullnames);
$addr = array('253 Abbey road', '417 Mulberyy ln', '5605 apple st');
$simplate->assign('address', $addr);
$types = array(
array('home phone', 'cell phone', 'e-mail'),
array('home phone', 'web'),
array('cell phone')
);
$simplate->assign('contact_type', $types);
$info = array(
array('555-555-5555', '666-555-5555', 'yamada@simplate.com'),
array('123-456-4', 'www.simplate.com'),
array('0457878')
);
$simplate->assign('contact_info', $info);
?>
このテンプレートでは、$contact_type[customer] は現在の顧客の連絡手段を格納した配列となります。
<{section name=customer loop=$custid}>
<hr>
id: <{$custid[customer]}><br />
name: <{$name[customer]}><br />
address: <{$address[customer]}><br />
<{section name=contact loop=$contact_type[customer]}>
<{$contact_type[customer][contact]}>: <{$contact_info[customer][contact]}><br />
<{/section}>
<{/section}>
上の例の出力。
<hr>
id: 1000<br />
name: Taro Yamada<br />
address: 253 Abbey road<br />
home phone: 555-555-5555<br />
cell phone: 666-555-5555<br />
e-mail: yamada@simplate.com<br />
<hr>
id: 1001<br />
name: Hanako Tanaka<br />
address: 417 Mulberry ln<br />
home phone: 123-456-4<br />
web: www.simplate.com<br />
<hr>
id: 1002<br />
name: Ichiro Suzuki<br />
address: 5605 apple st<br />
cell phone: 0457878<br />
index は現在のループインデックスを表示します。0 (又は start 属性の値) から始まり、1 (又は step 属性の値) ずつ増加します。
ちなみに $custid[customer.index] と $custid[customer] は同じ意味です。
<{section name=customer loop=$custid}>
<{$simplate.section.customer.index}> id: <{$custid[customer]}><br />
<{/section}>
上の例の出力
0 id: 1000<br /> 1 id: 1001<br /> 2 id: 1002<br />
first は、現在 <{section}> の一回目の処理を行っている場合に TRUE となります。
last は、現在 <{section}> の最後の処理を行っている場合に TRUE となります。
この例は $customers 配列をループし、ループの最初でヘッダブロック、そしてループの最後でフッタブロックを出力します。
<{section name=customer loop=$contacts}>
<{if $simplate.section.customer.first}>
<table>
<tr><th>id</th><th>customer</th></tr>
<{/if}>
<tr>
<td><{$customers[customer].name}></td>
<td><{$customers[customer].email}></td>
</tr>
<{if $simplate.section.customer.last}>
<tr><td></td><td><{$simplate.section.contacts.count}> customers</td></tr>
</table>
<{/if}>
<{/section}>
<{foreach}> も参照してください。