{section},{sectionelse}

{section} は、 データが格納された数値添字配列 をループするために使用します。 これは、{foreach}1つの連想配列 をループするのとは異なります。すべての {section} タグは、終了タグ {/section} とペアになっている必要があります。

属性名 必須 デフォルト 概要
name string Yes n/a セクション名
loop mixed Yes n/a ループ回数を決定する値
start integer No 0 ループを開始するインデックス位置。この値が負の場合は、 配列の最後尾から開始位置が算出されます。 例えばループ配列に7つの値があり、そしてstartが-2であるならば、 開始インデックスは5になります。 ループ配列の長さを超えるような無効な値は、 自動的に最も近い値に切り捨てられます。
step integer No 1 ループインデックスを進めるために使われるステップ値。 例えばstep=2なら、インデックスは0, 2, 4をループします。 stepの値が負の場合は、配列の前方に向かって進みます。
max integer No n/a セクションがループする最大の回数
show boolean No TRUE このセクションを表示するかどうか

Example 7.30. {section} でのシンプルな配列のループ

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


<?php
$data = array(1000,1001,1002);
$smarty->assign('custid',$data);
?>

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


{* この例は $custid 配列のすべての値を表示します *}
{section name=customer loop=$custid}
  id: {$custid[customer]}<br />
{/section}
<hr />
{* $custid 配列のすべての値を逆順に表示します *}
{section name=foo loop=$custid step=-1}
  {$custid[foo]}<br />
{/section}

  

上の例の出力


id: 1000<br />
id: 1001<br />
id: 1002<br />
<hr />
id: 1002<br />
id: 1001<br />
id: 1000<br />

  

Example 7.31. {section} で配列を割り当てない例


{section name=foo start=10 loop=20 step=2}
  {$smarty.section.foo.index}
{/section}
<hr />
{section name=bar loop=21 max=6 step=-2}
  {$smarty.section.bar.index}
{/section}

上の例の出力

  
10 12 14 16 18
<hr />
20 18 16 14 12 10

  

Example 7.32. {section} の名前

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


{section name=anything loop=$myArray}
  {$myArray[anything].foo}
  {$name[anything]}
  {$address[anything].bar}
{/section}

  

Example 7.33. {section} での連想配列のループ

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

  
<?php
$data = array(
          array('name' => 'John Smith', 'home' => '555-555-5555',
                'cell' => '666-555-5555', 'email' => 'john@myexample.com'),
          array('name' => 'Jack Jones', 'home' => '777-555-5555',
                'cell' => '888-555-5555', 'email' => 'jack@myexample.com'),
          array('name' => 'Jane Munson', 'home' => '000-555-5555',
                'cell' => '123456', 'email' => 'jane@myexample.com')
        );
$smarty->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}
</p>
{/section}

  

上の例の出力


<p>
  name: John Smith<br />
  home: 555-555-5555<br />
  cell: 666-555-5555<br />
  e-mail: john@myexample.com
</p>
<p>
  name: Jack Jones<br />
  home phone: 777-555-5555<br />
  cell phone: 888-555-5555<br />
  e-mail: jack@myexample.com
</p>
<p>
  name: Jane Munson<br />
  home phone: 000-555-5555<br />
  cell phone: 123456<br />
  e-mail: jane@myexample.com
</p>

  

Example 7.34. {section} での loop 変数の使用

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


<?php

$id = array(1001,1002,1003);
$smarty->assign('custid',$id);

$fullnames = array('John Smith','Jack Jones','Jane Munson');
$smarty->assign('name',$fullnames);

$addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
$smarty->assign('address',$addr);

?>

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


{section name=customer loop=$custid}
<p>
  id: {$custid[customer]}<br />
  name: {$name[customer]}<br />
  address: {$address[customer]}
</p>
{/section}

  

上の例の出力


<p>
  id: 1000<br />
  name: John Smith<br />
  address: 253 Abbey road
</p>
<p>
  id: 1001<br />
  name: Jack Jones<br />
  address: 417 Mulberry ln
</p>
<p>
  id: 1002<br />
  name: Jane Munson<br />
  address: 5605 apple st
</p>

  

Example 7.35. ネストした {section}

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


<?php

$id = array(1001,1002,1003);
$smarty->assign('custid',$id);

$fullnames = array('John Smith','Jack Jones','Jane Munson');
$smarty->assign('name',$fullnames);

$addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
$smarty->assign('address',$addr);

$types = array(
           array( 'home phone', 'cell phone', 'e-mail'),
           array( 'home phone', 'web'),
           array( 'cell phone')
         );
$smarty->assign('contact_type', $types);

$info = array(
           array('555-555-5555', '666-555-5555', 'john@myexample.com'),
           array( '123-456-4', 'www.example.com'),
           array( '0457878')
        );
$smarty->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: John Smith<br />
  address: 253 N 45th<br />
    home phone: 555-555-5555<br />
    cell phone: 666-555-5555<br />
    e-mail: john@myexample.com<br />
<hr>
  id: 1001<br />
  name: Jack Jones<br />
  address: 417 Mulberry ln<br />
    home phone: 123-456-4<br />
    web: www.example.com<br />
<hr>
  id: 1002<br />
  name: Jane Munson<br />
  address: 5605 apple st<br />
    cell phone: 0457878<br />

  

Example 7.36. データベースを使用する {sectionelse} の例

データベース (ADODB や PEAR) の検索結果を Smarty に格納します。

  
<?php
$sql = 'select id, name, home, cell, email from contacts '
      ."where name like '$foo%' ";
$smarty->assign('contacts', $db->getAll($sql));
?>

データベースの結果を HTML のテーブルに出力するテンプレート


<table>
<tr><th>&nbsp;</th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
{section name=co loop=$contacts}
  <tr>
    <td><a href="view.php?id={$contacts[co].id}">view<a></td>
    <td>{$contacts[co].name}</td>
    <td>{$contacts[co].home}</td>
    <td>{$contacts[co].cell}</td>
    <td>{$contacts[co].email}</td>
  <tr>
{sectionelse}
  <tr><td colspan="5">No items found</td></tr>
{/section}
</table>


.index

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

テクニカルノート

stepstart 属性が変更されていない場合は、セクションのプロパティ iteration と同じ動作をします。ただ、1 ではなく 0 から始まるという点が異なります。

Example 7.37. {section} の index プロパティ

ちなみに……

$custid[customer.index]$custid[customer] は同じ意味です。


{section name=customer loop=$custid}
  {$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}

  

上の例の出力


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

   

.index_prev

index_prev は前回のループインデックスを表示します。最初のループでは-1がセットされます。

.index_next

index_next は次回のループインデックスを表示します。 ループの最後でもやはり現在のインデックスの次回の値を返します (step 属性の設定に従います)。

Example 7.38. indexindex_next および index_prev プロパティ


<?php
$data = array(1001,1002,1003,1004,1005);
$smarty->assign('rows',$data);
?>

上の配列をテーブルに出力するテンプレート


{* $rows[row.index] と $rows[row] は同じ意味です *}
<table>
  <tr>
    <th>index</th><th>id</th>
    <th>index_prev</th><th>prev_id</th>
    <th>index_next</th><th>next_id</th>
  </tr>
{section name=row loop=$rows}
  <tr>
    <td>{$smarty.section.row.index}</td><td>{$rows[row]}</td>
    <td>{$smarty.section.row.index_prev}</td><td>{$rows[row.index_prev]}</td>
    <td>{$smarty.section.row.index_next}</td><td>{$rows[row.index_next]}</td>
  </tr>
{/section}
</table>

  

上の例の出力するテーブルは次のようになります。


index  id    index_prev prev_id index_next next_id
0      1001  -1	                1          1002
1      1002  0          1001    2          1003
2      1003  1          1002    3          1004
3      1004  2          1003    4          1005
4      1005  3          1004    5

   

.iteration

iteration は現在のループが反復された回数を表示します。

Note

index プロパティとは異なり、これは {section} のプロパティ startstep および max の影響を受けません。 iteration も 1 から始まります。これは index が 0 から始まるのとは異なります。rownumiteration の別名で、全く同じ働きをします。

Example 7.39. セクションのプロパティ iteration


<?php
// 3000 から 3015 までの配列
$id = range(3000,3015);
$smarty->assign('arr',$id);
?>

$arr 配列の要素を step=2 で出力するテンプレート


{section name=cu loop=$arr start=5 step=2}
  iteration={$smarty.section.cu.iteration}
  index={$smarty.section.cu.index}
  id={$custid[cu]}<br />
{/section}

  

上の例の出力


iteration=1 index=5 id=3005<br />
iteration=2 index=7 id=3007<br />
iteration=3 index=9 id=3009<br />
iteration=4 index=11 id=3011<br />
iteration=5 index=13 id=3013<br />
iteration=6 index=15 id=3015<br />

   

もうひとつの例は、iteration プロパティを使用して 5 行おきにテーブルのヘッダ部を出力します。 {if} 関数を mod 演算子とともに使用します。


<table>
{section name=co loop=$contacts}
  {if $smarty.section.co.iteration % 5 == 1}
    <tr><th>&nbsp;</th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
  {/if}
  <tr>
    <td><a href="view.php?id={$contacts[co].id}">view<a></td>
    <td>{$contacts[co].name}</td>
    <td>{$contacts[co].home}</td>
    <td>{$contacts[co].cell}</td>
    <td>{$contacts[co].email}</td>
  <tr>
{/section}
</table>

  

.first

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

.last

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

Example 7.40. {section} プロパティ firstlast

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


{section name=customer loop=$customers}
  {if $smarty.section.customer.first}
    <table>
    <tr><th>id</th><th>customer</th></tr>
  {/if}

  <tr>
    <td>{$customers[customer].id}}</td>
    <td>{$customers[customer].name}</td>
  </tr>

  {if $smarty.section.customer.last}
    <tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
    </table>
  {/if}
{/section}

  

.rownum

rownum は現在のループが反復された回数を表示します(1から開始)。 これは iteration の別名で、同じ動作をします。

.loop

loop は、この {section} ループの最後のインデックス番号を表示します。 {section} の内部だけでなく、外部で使用することもできます。

Example 7.41. {section} プロパティ loop


{section name=customer loop=$custid}
  {$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
There are {$smarty.section.customer.loop} customers shown above.

  

上の例の出力


0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br />
There are 3 customers shown above.

   

.show

show は、セクションのパラメータとして使用する boolean 値です。FALSE の場合はこのセクションは表示されません。 {sectionelse} があれば、それが代わりに表示されます。

Example 7.42. show プロパティ

Boolean $show_customer_info を PHP アプリケーションから渡し、このセクションを表示するかどうかを調整します。


{section name=customer loop=$customers show=$show_customer_info}
  {$smarty.section.customer.rownum} id: {$customers[customer]}<br />
{/section}

{if $smarty.section.customer.show}
  the section was shown.
{else}
  the section was not shown.
{/if}

  

上の例の出力


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

the section was shown.

   

.total

total{section} がループしたトータル回数を表示します。これは {section} の内部だけでなく外部でも使うことができます。

Example 7.43. total プロパティの例


{section name=customer loop=$custid step=2}
  {$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
   There are {$smarty.section.customer.total} customers shown above.

  

{foreach} および $smarty.section も参照してください。