Feb 25

逆引きrhaco(?)21: DBの姓、名カラムを合わせて氏名を出力する+表示順を決める

本当はリストを出力するコードが先だけど、驚いたのでメモ。ちょっと長いので該当する部分だけにします。

DBからデータを取ってきて出力する時

<rt:loop param="{$object.models('views','form_display')}" var="column">
  <tr>
  <th>{$tableObject.label($column)}</th>
  <td>
    {$object->value($column,true)}
  </td>
  </tr>
</rt:loop>

みたいにリスト出力したい時ありますよね(ちなみにこのソースはrhaco本体からパクってきました)。リスト表示は後日書きます。ただこの場合だと姓、名というカラムがある場合
<tr><th>姓</th><td>田中</td></tr>
<tr><th>名</th><td>一郎</td></tr>

※順序はこうなるとは限りません
みたいに2行に出力されますよね。rhacoではextraとmodelsを用いることで「氏名」に繋げたものを表示できます。

まずはproject.xmlにextraとしてseimeiを追加します。
<table name="member">
<column name="sei">姓</column>
<column name="mei">名</column>
<extra name="simei">氏名</extra>
</table>

これでsetupからsettingを選んでsettingするとlibrary/model/table/MemberTable.phpに氏名のプロパティ($simei)とメソッド(getSimeiなど)が追加されます。このgetSimeiなどのメソッドはlibrary/model/Member.phpにて上書きできます。今回は姓と名をくっつけたいので

library/model/Member.php
function getSimei(){
  return $this->getSei().$this->getMei();
}

とすると先ほどのままで出力すると
<tr><th>姓</th><td>田中</td></tr>
<tr><th>名</th><td>一郎</td></tr>
<tr><th>氏名</th><td>田中一郎</td></tr>

※順序はこうなるとは限りません
と、氏名を出力することができます!ただこれだと姓とか名とかも表示されてます。そこで

先ほどのlibrary/model/Member.phpに次のコードを追加します。
function views(){
  return array('form_display'=>'simei');
}

すると
<tr><th>氏名</th><td>田中一郎</td></tr>

と氏名だけ表示されるようになります!
また
function views(){
  return array('form_display'=>'simei,sei,mei');
}

とすると、確実に
<tr><th>氏名</th><td>田中一郎</td></tr>
<tr><th>姓</th><td>田中</td></tr>
<tr><th>名</th><td>一郎</td></tr>

という表示になります。viewsに上のような形のコンマ区切りで指定すると表示する順序を「指定」することができます。

この2つの機能は「たくさんのカラムを順序を決めて出力したい+住所とか氏名はつなげたい」というWebプログラムでよくあるけどやりにくい条件を簡単に実現できます。

| comment(0)

このエントリーのはてなブックマーク (-)