simplate (0.4.2) | 2010-01-13 01:02 |
<{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() します。
配列を出力するテンプレート
上の例の出力
<{section}> の name は自由につけることができます。PHP の変数 を参照してください。これは、<{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 を出力するテンプレート
上の例の出力
- <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 スクリプトです。
loop 変数は、ループの回数を決定するためにのみ使用します。<{section}> 内ではあらゆるテンプレート変数にアクセス可能です。
上の例の出力
<{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] は同じ意味です。
上の例の出力
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}> も参照してください。