Get Smarty

Donate

Paypal

Smarty Icon

You may use the Smarty logo according to the trademark notice.

Smarty Template Engine Smarty Template Engine

For sponsorship, advertising, news or other inquiries, contact us at:

Sites Using Smarty

Advertisement

{section},{sectionelse}

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

Note

{foreach} ループは、{section} ループができることならすべてできるうえに、構文がよりシンプルで簡単です。 通常は {section} ループよりもこちらのほうをお勧めします。

Note

{section} ループは連想配列を扱うことができません。数値のインデックスで、かつ 0,1,2,... と順に並んでいなければなりません。連想配列の場合は {foreach} ループを使いましょう。

属性名 必須 デフォルト 概要
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 このセクションを表示するかどうか

オプションのフラグ

名前 概要
nocache {section} ループのキャッシュを無効にする
  • 必須の属性は nameloop です。

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

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

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

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

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

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

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

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

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


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

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


{* この例は $custid 配列のすべての値を表示します *}
{section name=customer loop=$custid}
{section customer $custid} {* 短縮形 *}
  id: {$custid[customer]}<br />
{/section}
<hr />
{* $custid 配列のすべての値を逆順に表示します *}
{section name=foo loop=$custid step=-1}
{section foo $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.61. {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.62. {section} の名前

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


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

  

Example 7.63. {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.64. {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.65. ネストした {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.66. データベースを使用する {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.67. {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.68. 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.69. セクションのプロパティ 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 行おきにテーブルのヘッダ部を出力します。


<table>
{section name=co loop=$contacts}
  {if $smarty.section.co.iteration is div by 5}
    <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>

  

iteration プロパティを使って、 3 行ごとにテキストの色を変更します。

  
  <table>
  {section name=co loop=$contacts}
    {if $smarty.section.co.iteration is even by 3}
      <span style="color: #ffffff">{$contacts[co].name}</span>
    {else}
      <span style="color: #dddddd">{$contacts[co].name}</span>
    {/if}
  {/section}
  </table>
  
    

Note

"is div by" 構文は、PHP の mod 演算子と同じ意味です。 mod 演算子も同じように使えるので、{if $smarty.section.co.iteration % 5 == 1} も同じように動作します。

Note

同じく "is odd by" を使えば、色を反転させることができます。

.first

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

.last

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

Example 7.70. {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.71. {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.72. 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.73. 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}{for}{while} および $smarty.section も参照ください。

Comments
No comments for this page.

Advertisement

Sponsors [info]

Sponsors