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プログラムでよくあるけどやりにくい条件を簡単に実現できます。
このエントリーのはてなブックマーク (