Develop and Download Open Source Software

Recent Changes

2010-08-27
2010-03-14
2010-01-13
2010-01-12

Wiki Guide

Side Bar

<{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() します。

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

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

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

上の例の出力

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

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

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

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

<?php
$data = array(
          array('name' => 'Taro Yamada', 'home' => '555-555-5555',
                'cell' => '666-555-5555', 'email' => 'yamada@simplate.com'),
          array('name' => 'Hanako Tanaka', 'home' => '777-555-5555',
                'cell' => '888-555-5555', 'email' => 'tanaka@simplate.com'),
          array('name' => 'Ichiro Suzuki', 'home' => '000-555-5555',
                'cell' => '123456', 'email' => 'suzuki@simplate.com')
        );
$simplate->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}><br />
</p>
<{/section}>

上の例の出力

<p>
  name: Taro Yamada<br />
  home: 555-555-5555<br />
  cell: 666-555-5555<br />
  e-mail: yamada@simplate.com<br />
</p>
<p>
  name: Hanako Tanaka<br />
  home: 777-555-5555<br />
  cell: 888-555-5555<br />
  e-mail: tanaka@simplate.com<br />
</p>
<p>
  name: Ichiro Suzuki<br />
  home: 000-555-5555<br />
  cell: 123456<br />
  e-mail: suzuki@simplate.com<br />
</p>
例. <{section}> での loop 変数の使用

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

<?php
$id = array(1000, 1001, 1002);
$fullnames = array('Taro Yamada', 'Hanako Tanaka', 'Ichiro Suzuki');
$addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');

$simplate->assign('custid', $id);
$simplate->assign('name', $fullnames);
$simplate->assign('address', $addr);
?>

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

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

上の例の出力

<p>
  id: 1000<br />
  name: Taro Yamada<br />
  address: 253 Abbey road<br />
</p>
<p>
  id: 1001<br />
  name: Hanako Tanaka<br />
  address: 417 Mulberry ln<br />
</p>
<p>
  id: 1002<br />
  name: Ichiro Suzuki<br />
  address: 5605 apple st<br />
</p>
例. ネストした <{section}>

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

<?php

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

$fullnames = array('Taro Yamada', 'Hanako Tanaka', 'Ichiro Suzuki');
$simplate->assign('name', $fullnames);

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

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

$info = array(
           array('555-555-5555', '666-555-5555', 'yamada@simplate.com'),
           array('123-456-4', 'www.simplate.com'),
           array('0457878')
        );
$simplate->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: Taro Yamada<br />
  address: 253 Abbey road<br />
    home phone: 555-555-5555<br />
    cell phone: 666-555-5555<br />
    e-mail: yamada@simplate.com<br />
<hr>
  id: 1001<br />
  name: Hanako Tanaka<br />
  address: 417 Mulberry ln<br />
    home phone: 123-456-4<br />
    web: www.simplate.com<br />
<hr>
  id: 1002<br />
  name: Ichiro Suzuki<br />
  address: 5605 apple st<br />
    cell phone: 0457878<br />

.index

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

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

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

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

上の例の出力

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

.first

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

.last

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

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

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

<{section name=customer loop=$contacts}>
<{if $simplate.section.customer.first}>
<table>
<tr><th>id</th><th>customer</th></tr>
<{/if}>
<tr>
  <td><{$customers[customer].name}></td>
  <td><{$customers[customer].email}></td>
</tr>
<{if $simplate.section.customer.last}>
<tr><td></td><td><{$simplate.section.contacts.count}> customers</td></tr>
</table>
<{/if}>
<{/section}>

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

Smarty との差分

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

SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.