このマニュアルはSmartyのものです。セキュリティなどの問題でRCMSでは利用できないものもありますので、ご注意ください。
{section},{sectionelse} {section},{sectionelse}
{section} は、
データの配列 をループするために使用します。
これは、{foreach}
が 1つの連想配列
をループするのとは異なります。すべての {section}
タグは、終了タグ {/section} とペアになっている必要があります。
必須の属性は name と loop
です。
{section} の name は、
英数字とアンダースコアを使って自由に命名できます。これは
PHP の変数
と同様です。
{section} はネスト可能で、その場合の
{section} の名前はお互いにユニークである必要があります。
loop 属性で指定されたループ変数
(たいていは配列) は、{section}
のループ回数を決定するために使用されます。
loop の値として、整数値を渡すこともできます。
{section} 内で値を表示するには、
変数名に続けてブラケット {} で囲んだセクション名を指定します。
ループ変数に値が存在しない場合は
{sectionelse} が実行されます。
{section} には、そのプロパティを操作するための
自身の変数があります。これらには
{$smarty.section.name.property}
としてアクセスできます。"name" は、name
属性の値です。
{section} のプロパティには、
index 、
index_prev 、
index_next 、
iteration 、
first 、
last 、
rownum 、
loop 、
show 、
total
があります。
例 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> </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 属性の値)ずつ増加します。
テクニカルノート:
step と start
属性が変更されていない場合は、セクションのプロパティ 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. index 、index_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} のプロパティ
start 、step および max
の影響を受けません。
iteration も 1 から始まります。これは
index が 0 から始まるのとは異なります。rownum
は iteration の別名で、全く同じ働きをします。
例 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> </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} プロパティ first と last
この例は $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
も参照してください。