SEARCH

このマニュアルはSmartyのものです。セキュリティなどの問題でRCMSでは利用できないものもありますので、ご注意ください。
{section},{sectionelse}

{section},{sectionelse}

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

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

  • 必須の属性は nameloop です。

  • {section}name は、 英数字とアンダースコアを使って自由に命名できます。これは PHP の変数 と同様です。

  • {section} はネスト可能で、その場合の {section} の名前はお互いにユニークである必要があります。

  • loop 属性で指定されたループ変数 (たいていは配列) は、{section} のループ回数を決定するために使用されます。 loop の値として、整数値を渡すこともできます。

  • {section} 内で値を表示するには、 変数名に続けてブラケット {} で囲んだセクション名を指定します。

  • ループ変数に値が存在しない場合は {sectionelse} が実行されます。

  • {section} には、そのプロパティを操作するための 自身の変数があります。これらには {$smarty.section.name.property} としてアクセスできます。"name" は、name 属性の値です。

  • {section} のプロパティには、 indexindex_previndex_nextiterationfirstlastrownumloopshowtotal があります。

例 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 />

例 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

例 7-32. {section} の名前

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

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

例 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>

例 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>

例 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 />

例 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}"&#62;view&#60;a&#62;&#60;/td&#62;
    &#60;td&#62;{$contacts[co].name}&#60;/td&#62;
    &#60;td&#62;{$contacts[co].home}&#60;/td&#62;
    &#60;td&#62;{$contacts[co].cell}&#60;/td&#62;
    &#60;td&#62;{$contacts[co].email}&#60;/td&#62;
  &#60;tr&#62;
{sectionelse}
  &#60;tr&#62;&#60;td colspan="5">No items found</td></tr>
{/section}
</table>

.index

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

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

例 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 属性の設定に従います)。

例 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 は現在のループが反復された回数を表示します。

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

例 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 となります。

例 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} の内部だけでなく、外部で使用することもできます。

例 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} があれば、それが代わりに表示されます。

例 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} の内部だけでなく外部でも使うことができます。

例 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 も参照してください。

SEARCH