add to hatena hatena.comment (1) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 1

CakePHP Helper 一行置きに背景の色を変える

最近はCakePHPなどのフレームワークを使って開発することが多くなり、利用する機会が減ってしまいましたが、以前はSmartyをよく使っていました。

Smartyを使っていて便利だと思ったのがcycle関数です。

この関数はデータの一覧を表示する際などに下表のように一行置きにテーブル行の背景色を変更する場合などに重宝していました。

松井 秀喜 ヤンキース
井川 慶 ヤンキース
イチロー マリナーズ
城島 健司 マリナーズ
福留 孝介 カブス
岩村 明憲 レイズ
松坂 大輔 レッドソックス
岡島 秀樹 レッドソックス

CakePHPで開発する際は、基本的にはテンプレートは素のPHPで記述しています。PHPでもちょっとしたIF文を記述すれば同様のことはすぐにできるのですが、、結構利用頻度が高そうなので簡単なCycleヘルパにしてみました。

使い方1 changeメソッド

1.上記の例のように、一行置きに背景色を変更する

PHP:
  1. <?php
  2. // 背景色の定義(白と黄色の2色にローテーションさせる)
  3.   $bgcolor = array('white', 'yellow');
  4. ?>
  5. <table border="1">
  6. <tbody>
  7. <?php foreach ($data as $i->$_data): ?>
  8. <tr style="background:<?php echo $cycle->change($bgcolor, $i); ?>">
  9. <td>$_data['Major']['name']</td>
  10. <td>$_data['Major']['team']</td>
  11. </tr>
  12. <?php endforeach;?>
  13. </tbody></table></div>

chaneメソッドは第2引数(上記だと$iのイテレータ)の値が変化すると第1引数の配列の値を順番に出力します。

この例だと$iが毎回変化するので、交互に白と黄色の文字列が出力されます。

2.応用編:チームが変わったら背景色を変更する

上表のようにチーム順にソートされている場合は、チームが変わったタイミングで色を変更するほうが識別し易いケースもあります。この場合は

PHP:
  1. <tr style="background:<?php echo $cycle->change($bgcolor, $_data['Major']['team']);?>">

と記述します。先ほどの$iのイテレータ変数の変わりにチーム名の変数を第2引数に指定します。

これで表示を行った場合は、下表のようになります。

松井 秀喜 ヤンキース
井川 慶 ヤンキース
イチロー マリナーズ
城島 健司 マリナーズ
福留 孝介 カブス
岩村 明憲 レイズ
松坂 大輔 レッドソックス
岡島 秀樹 レッドソックス

使い方2 matchメソッド

3.特定の値の場合に背景色を変更する

matchメソッドは値が1の場合はA、2の場合はBといった特定の値に対応して出力を変更します。

上の例で、チーム名がカブスなら青、レッドソックスなら赤を表示させる場合は以下のように記述します。

PHP:
  1. <?php
  2. // 背景色の定義(カブスなら青、レッドソックスなら赤)
  3.   $bgcolor = array('カブス' => 'blue', 'レッドソックス' => 'red');
  4. ?>
  5. <table border="1">
  6. <tbody>
  7. <?php foreach ($data as $i->$_data): ?>
  8. <tr style="background:<?php echo $cycle->match($bgcolor, $_data['Major']['team']); ?>">
  9. <td>$_data['Major']['name']</td>
  10. <td>$_data['Major']['team']</td>
  11. </tr>
  12. <?php endforeach;?>
  13. </tbody></table>

これを実行した例は、

松井 秀喜 ヤンキース
井川 慶 ヤンキース
イチロー マリナーズ
城島 健司 マリナーズ
福留 孝介 カブス
岩村 明憲 レイズ
松坂 大輔 レッドソックス
岡島 秀樹 レッドソックス

となります。

ソースコード:cycle.php

PHP:
  1. CycleHelper extends Helper {
  2.  var $value = array();
  3.  var $index = array();
  4.  
  5.  /**
  6.   *  値が変われば背景色を変更する場合などに利用
  7.   */
  8.  function change($list, $value, $key = 0) {
  9.   if($value != $this-&gt;value[$key]){
  10.    $this-&gt;value[$key] = $value;
  11.    if(isset($list[$this-&gt;index[$key] + 1])){
  12.     $this-&gt;index[$key]++;
  13.    }else{
  14.     $this-&gt;index[$key] = 0;
  15.    }
  16.   }
  17.   return $list[$this-&gt;index[$key]];
  18.  }
  19.  
  20.  /**
  21.   *  値がリストと一致した場合に表示
  22.   */
  23.  function match($list, $value) {
  24.   if(isset($list[$value])){
  25.    return $list[$value];
  26.   }else{
  27.    return "";
  28.   }
  29.  }
  30. }

関連するその他の記事

Comments

Leave a Reply