PEAR/HTML_Template_Flexy

繰り返し Flexy:foreach

PHP::PEAR

データが複数行ある場合、
繰り返しを使って表示します。
データベースからデータをとってきて、
foreachで表示というのは、
どのテンプレートエンジンでも定石です。

構文はこんな感じ。

   タグの中に記述する場合
     キーがあるとき
       <tag flexy:foreach="パラメータ,キー,値">
         ループ内容
       </tag>
     キーがないとき
       <tag flexy:foreach="パラメータ,値">
         ループ内容
       </tag>
   タグの外に記述する場合:
     キーがあるとき
       {foreach:パラメータ,キー,値}
         ループ内容
       {end:}
     キーがないとき
       {foreach:パラメータ,値}
         ループ内容
       {end:}

Smartyサイトのサンプルを拝借
http://smarty.php.net/manual/en/language.function.foreach.php

Example 7-4. valueのみのforeach

プログラム側

<?php
$flexyObj->arr = array( 1001,1002,1003 );
?>  

テンプレート

{foreach:arr,curr_id}
  id: {curr_id}<br />
{end:}
<div flexy:foreach="arr,curr_id">id: {curr_id}</div>

出力結果は

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

Example 7-5. keyとvalueを使ったforeach

プログラム側

   $nestObj = & new nest;
   $nestObj->phone = 1;
   $nestObj->fax = 2;
   $nestObj->cell = 3;

   $flexyObj->contacts[] = $nestObj;

   $nestObj = & new nest;
   $nestObj->phone = '555-4444';
   $nestObj->fax = '555-3333';
   $nestObj->cell = '760-1234';

   $flexyObj->contacts[] = $nestObj;

   class nest
   {
       var $phone = "";
       var $fax = "";
       var $cell = "";
   }

テンプレート側

   {foreach:contacts,contact}
   <hr />
     <div flexy:foreach="contact,key,value">{key}: {value}</div>
   {end:}

Example 7-6. データベースラッパーとの連携 ( PEAR, ADODB, PDO )

プログラム側

   $sql = "SELECTcontact_id, name, nick, date ".
          " FROM contacts ORDER BY contact";
   $db->setFetchMode( DB_FETCHMODE_OBJECT, "contact");
   $this->contacts = & $db->getAll($sql);

   require_once("DB.php");
   class contact extends DB_row
   {
       var $contact_id = "";
       var $name = "";
       var $nick = "";
       var $date = "";
       function dateformat()
       {
           return date("Y-m-d H:i:s", strtotime( $this->date ) );
       }
   }

テンプレート側

   <div flexy:foreach="contacts,value">
     <a href="contact.php?contact_id={value.contact_id}">
     {value.name} - {value.nick}</a>({value.dateformat()})
   </div>

DBからの結果は配列ではなくオブジェクトで取得してください。
セットしたオブジェクトを拡張することで非常に柔軟な表示が可能になります。

配列にするとテンプレート上に非常に複雑なコードを書くことになるか、
プログラム上で展開して値を変更するなどが必要になる場合が出てきます。

参考:DB::setFetchMode()


お名前:


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Third Project
証券会社ランキング比較