2007年11月16日

CodeIgniterのHTMLテーブルクラス

前回はModelを作成してコードを分離しましたが、力尽きて長くなりそうだったので、VIEWでテーブルに整形するところまでは書けませんでした。今回はデータをTableタグで整形表示してみようとおもいます。

単純にTableタグをベタ打ちしてもいいのですが、せっかくHTMLテーブルクラスなるものがあるので、それを試して見ます。

まずgenerateというそのものずばりみたいなものがあるので、前回までのコードで$datas(データ内容が多次元配列化されたモノ)を単純にgenerateに渡してみます。

VIEW
$this->table->generate($datas);

表示結果
generate.png
おお!ちゃんとテーブルだ!(当たり前か?)で、よく見ると、データの1行目が見出しタグ<th>になってしまっています。これはページ移動しても必ず1行目はそうなってます。

それとまあ当然といえば当然ですが、旧市町村のところがArrayになってしまっています。

というわけでまずthを指定してみました。

VIEW
$this->table->set_heading('ID', '都道府県', '新市町村', '旧市町村', '合併日');

表示結果
table_header.png
今度はきちんとテーブルヘッダが出力されました。

で、旧市町村部分ですが、結論から言うとCodeIgniterのHTMLテーブルクラスでは対応が困難なため、foreachで自力?で出力することにしました(--;

まあ<td rowspan="5">とかやらなきゃいけないので、汎用的なクラスではできなくてもしょうがないとおもいますが、もしかしたらテーブルクラスを使って作る方法があるかもしれません。

ユーザガイドを一通り見たところでは、テンプレートを使ってごにょごにょすればなんとなくいけそうかなぁ?というところまでは見えましたが、どうもこのデフォルトのテンプレートは、よくある奇数行と偶数行の交互に色違いみたいなのを前提としているようで、そうした用途以外でテンプレートを使おうとするとクラスを継承して〜とかなんか難しそうなので止めました(--;

で、自力出力
<table border="1" cellspacing="0" cellpadding="2" width="600">
<tr>
<th>都道府県</th>
<th>新市町村</th>
<th>旧市町村</th>
<th>合併日</th>
</tr>
<?foreach($datas as $row):?>
<?$rowspan=count($row['ocity'])?>
<tr>
<td rowspan="<?=$rowspan?>"><?=$row['pref']?></td>
<td rowspan="<?=$rowspan?>"><?=$row['ncity']?></td>
<td><?=($ocity=array_shift($row['ocity']))?$ocity['oc']:NULL?></td>
<td rowspan="<?=$rowspan?>"><?=$row['date']?></td>
</tr>
<?foreach($row['ocity'] as $oc):?>
<tr>
<td><?=$oc['oc']?></td>
</tr>
<?endforeach;?>
<?endforeach;?>
</table>

最初のテーブルヘッダまでの部分は単なるHTMLタグです。この部分だけはHTMLテーブルクラスで作れるかな?ともおもったのですが、最終的にgenerateを呼ばなきゃならないみたいなのでダメでした。なのでベタ打ちです。

次の部分からが内容出力です。foreachを入れ子にして旧市町村部分を出力する形になっています。まず$rowspanに旧市町村の数を入れて、都道府県・新市町村・合併日のカラムではその値でrowspan(上下の行をくっつけて表示)しています。

一般的にはこの$rowspanは0や1の値になる可能性があるかとおもいますが、今回使用しているこの合併データベースでは絶対に2以上になるので、その辺のロジックは端折ってます。

ちなみにHTMLタグ上でrowspan=1とやってもFirefox2では問題なくレンダリングされました。おそらく他のブラウザも問題ないと思います。0の場合はどうなんでしょうか?試してないのでわかりません(--;

んでこの次が問題なのですが、HTMLのテーブルタグの仕様ではrowspanされてないカラム(つまり旧市町村)も最初の一行はココに書かなきゃならないんです。(って文章だと全然わかりませんね)
<tr>
<td rowspan="5">(都道府県)</td>
<td rowspan="5">(新市町村)</td>
<td>ココに旧市町村の1行目を書く必要がある</td>
<td rowspan="5">(合併日)</td>
</tr>

しかも2行目からはこの下に続けて<tr>タグで書いていかなければならないわけです。

この仕様はプログラム的にはめんどくさいというか、複雑になりやすいというか…。例えば↑のココに旧市町村の1行目を書く必要があるという部分に入れ子の<tr>みたいな(なんじゃそりゃ?)形で書けたりとか、逆にその部分にはとりあえずダミーっつーかマーカ?っつーかなんかそんな感じのものだけ書いておいて、本データは下に続けて書くとかいう仕様だったら簡単だったんですが…。

まあ今更HTMLの仕様に文句いっても始まらないんで、苦肉の策というのか、正直言えばやり方がわからなかったんで、array_shiftです(--;。

array_shiftはPHPの組込関数?で配列の先頭の要素を取ってきて、元の配列からはそれを取り除きます。つまり配列が短くなるわけです。なんかこの手の関数ってのはきちんと使ってやらないとバグの温床になりそうな感じなんで、あんまり好きじゃないんですけど(何故ならきちんと使えないから…)。

ただこのおかげ(元の配列が短くなる)で、下のほうではforeachで回せるわけです。これが元の配列に影響がないと最初の1行を飛ばしてとかなんとかさらにメンドイ作業が…。

このデータベースの場合は旧市町村の数は絶対2以上(合併ですから)なことが保証されているのでこれでも動きますが、一般的な場合だとちゃんと値が入っているかとか配列なのかとかチェックしないとならないでしょうね(あ〜メンドイ)。

ということで表示結果です。
comp_table.png
ラベル:codeigniter
posted by ciallost at 12:10| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック