<{section}>

<{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 をループします。負の値は指定できません。
  • 必須の属性は nameloop です。
  • <{section}> の name は、英数字とアンダースコアを使って自由に命名できます。これは PHP の変数 と同様です。
  • <{section}> はネスト可能で、その場合の <{section}> の名前はお互いにユニークである必要があります。
  • loop 属性で指定されたループ変数 (たいていは配列) は、<{section}> のループ回数を決定するために使用されます。
  • <{section}> 内で値を表示するには、変数名に続けてブラケット <{}> で囲んだセクション名を指定します。
  • <{section}> には、そのプロパティを操作するための自身の変数があります。これらには <{$simplate.section.name.property}> としてアクセスできます。
  • <{section}> のプロパティには、indexfirstlast があります。

PHP や C、Java などの言語の for ループに慣れている方には、馴染みにくい構文ですが、name 属性はループ変数の変数名と考えると理解の一助になるかもしれません。実際コンパイル後のテンプレートファイルを読むと、section は for 文に展開し、name 属性に指定したループ変数でループしていることに気づくと思います。

例. <{section}> でのシンプルな配列のループ

配列を Simplate に assign() します。

  1. <?php
  2. $data = array(1000, 1001, 1002);
  3. $simplate->assign('custid', $data);
  4. ?>

配列を出力するテンプレート

  1. <{* この例は $custid 配列のすべての値を表示します *}>
  2. <{section name=customer loop=$custid}>
  3. id: <{$custid[customer]}><br />
  4. <{/section}>

上の例の出力

  1. id: 1000<br />
  2. id: 1001<br />
  3. id: 1002<br />
例. <{section}> の名前

<{section}> の name は自由につけることができます。PHP の変数 を参照してください。これは、<{section}> 内のデータを参照する際 に使用します。

  1. <{section name=anything loop=$myArray}>
  2. <{$myArray[anything].foo}>
  3. <{$name[anything]}>
  4. <{$address[anything].bar}>
  5. <{/section}>
例. <{section}> での連想配列のループ

これは、データの連想配列を <{section}> で出力する例です。次に示すのは、配列 $contacts を Simplate に渡す PHP スクリプトです。

  1. <?php
  2. $data = array(
  3. array('name' => 'Taro Yamada', 'home' => '555-555-5555',
  4. 'cell' => '666-555-5555', 'email' => 'yamada@simplate.com'),
  5. array('name' => 'Hanako Tanaka', 'home' => '777-555-5555',
  6. 'cell' => '888-555-5555', 'email' => 'tanaka@simplate.com'),
  7. array('name' => 'Ichiro Suzuki', 'home' => '000-555-5555',
  8. 'cell' => '123456', 'email' => 'suzuki@simplate.com')
  9. );
  10. $simplate->assign('contacts',$data);
  11. ?>

$contacts を出力するテンプレート

  1. <{section name=customer loop=$contacts}>
  2. <p>
  3. name: <{$contacts[customer].name}><br />
  4. home: <{$contacts[customer].home}><br />
  5. cell: <{$contacts[customer].cell}><br />
  6. e-mail: <{$contacts[customer].email}><br />
  7. </p>
  8. <{/section}>

上の例の出力

  1. <p>
  2. name: Taro Yamada<br />
  3. home: 555-555-5555<br />
  4. cell: 666-555-5555<br />
  5. e-mail: yamada@simplate.com<br />
  6. </p>
  7. <p>
  8. name: Hanako Tanaka<br />
  9. home: 777-555-5555<br />
  10. cell: 888-555-5555<br />
  11. e-mail: tanaka@simplate.com<br />
  12. </p>
  13. <p>
  14. name: Ichiro Suzuki<br />
  15. home: 000-555-5555<br />
  16. cell: 123456<br />
  17. e-mail: suzuki@simplate.com<br />
  18. </p>
例. <{section}> での loop 変数の使用

この例では、$custid$name および $address にはすべて配列が割り当てられ、その要素数は同じであるものとします。まず、Simplate に配列を割り当てる PHP スクリプトです。

  1. <?php
  2. $id = array(1000, 1001, 1002);
  3. $fullnames = array('Taro Yamada', 'Hanako Tanaka', 'Ichiro Suzuki');
  4. $addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
  5. $simplate->assign('custid', $id);
  6. $simplate->assign('name', $fullnames);
  7. $simplate->assign('address', $addr);
  8. ?>

loop 変数は、ループの回数を決定するためにのみ使用します。<{section}> 内ではあらゆるテンプレート変数にアクセス可能です。

  1. <{section name=customer loop=$custid}>
  2. <p>
  3. id: <{$custid[customer]}><br />
  4. name: <{$name[customer]}><br />
  5. address: <{$address[customer]}><br />
  6. </p>
  7. <{/section}>

上の例の出力

  1. <p>
  2. id: 1000<br />
  3. name: Taro Yamada<br />
  4. address: 253 Abbey road<br />
  5. </p>
  6. <p>
  7. id: 1001<br />
  8. name: Hanako Tanaka<br />
  9. address: 417 Mulberry ln<br />
  10. </p>
  11. <p>
  12. id: 1002<br />
  13. name: Ichiro Suzuki<br />
  14. address: 5605 apple st<br />
  15. </p>
例. ネストした <{section}>

<{section}> は無制限にネスト可能です。<{section}> をネストすることで、 多次元配列のような複雑なデータ構造にアクセスすることが可能です。これは、配列を割り当てる PHP スクリプトの例です。

  1. <?php
  2. $id = array(1001, 1002, 1003);
  3. $simplate->assign('custid', $id);
  4. $fullnames = array('Taro Yamada', 'Hanako Tanaka', 'Ichiro Suzuki');
  5. $simplate->assign('name', $fullnames);
  6. $addr = array('253 Abbey road', '417 Mulberyy ln', '5605 apple st');
  7. $simplate->assign('address', $addr);
  8. $types = array(
  9. array('home phone', 'cell phone', 'e-mail'),
  10. array('home phone', 'web'),
  11. array('cell phone')
  12. );
  13. $simplate->assign('contact_type', $types);
  14. $info = array(
  15. array('555-555-5555', '666-555-5555', 'yamada@simplate.com'),
  16. array('123-456-4', 'www.simplate.com'),
  17. array('0457878')
  18. );
  19. $simplate->assign('contact_info', $info);
  20. ?>

このテンプレートでは、$contact_type[customer] は現在の顧客の連絡手段を格納した配列となります。

  1. <{section name=customer loop=$custid}>
  2. <hr>
  3. id: <{$custid[customer]}><br />
  4. name: <{$name[customer]}><br />
  5. address: <{$address[customer]}><br />
  6. <{section name=contact loop=$contact_type[customer]}>
  7. <{$contact_type[customer][contact]}>: <{$contact_info[customer][contact]}><br />
  8. <{/section}>
  9. <{/section}>

上の例の出力。

  1. <hr>
  2. id: 1000<br />
  3. name: Taro Yamada<br />
  4. address: 253 Abbey road<br />
  5. home phone: 555-555-5555<br />
  6. cell phone: 666-555-5555<br />
  7. e-mail: yamada@simplate.com<br />
  8. <hr>
  9. id: 1001<br />
  10. name: Hanako Tanaka<br />
  11. address: 417 Mulberry ln<br />
  12. home phone: 123-456-4<br />
  13. web: www.simplate.com<br />
  14. <hr>
  15. id: 1002<br />
  16. name: Ichiro Suzuki<br />
  17. address: 5605 apple st<br />
  18. cell phone: 0457878<br />

.index

index は現在のループインデックスを表示します。0 (又は start 属性の値) から始まり、1 (又は step 属性の値) ずつ増加します。

例. <{section}> の index プロパティ

ちなみに $custid[customer.index] と $custid[customer] は同じ意味です。

  1. <{section name=customer loop=$custid}>
  2. <{$simplate.section.customer.index}> id: <{$custid[customer]}><br />
  3. <{/section}>

上の例の出力

  1. 0 id: 1000<br />
  2. 1 id: 1001<br />
  3. 2 id: 1002<br />

.first

first は、現在 <{section}> の一回目の処理を行っている場合に TRUE となります。

.last

last は、現在 <{section}> の最後の処理を行っている場合に TRUE となります。

例. <{section}> プロパティ first と last

この例は $customers 配列をループし、ループの最初でヘッダブロック、そしてループの最後でフッタブロックを出力します。

  1. <{section name=customer loop=$contacts}>
  2. <{if $simplate.section.customer.first}>
  3. <table>
  4. <tr><th>id</th><th>customer</th></tr>
  5. <{/if}>
  6. <tr>
  7. <td><{$customers[customer].name}></td>
  8. <td><{$customers[customer].email}></td>
  9. </tr>
  10. <{if $simplate.section.customer.last}>
  11. <tr><td></td><td><{$simplate.section.contacts.count}> customers</td></tr>
  12. </table>
  13. <{/if}>
  14. <{/section}>

<{foreach}> も参照してください。

Smarty との差分

  • loop 属性に整数を指定することはできません。このため、配列を割り当てない section を実現することはできません。
  • start 属性に負の値を指定することはできません。
  • step 属性に負の値を指定することはできません。
  • max, show 属性はサポートしていません。
  • index_prev, index_next, iteration, rownum, loop, show, total プロパティはサポートしていません。