autoGrow および autoFill の値
autoGrow
フラグ
通常は、テーブルの行や列の数は事前にわかっているでしょう。
しかし、時には必要な行や列の数がわからないこともあります。
たとえば、ユーザの入力内容や
データベースのクエリの結果を HTML テーブルにする場合などです。
このような場合は、autoGrow
機能を
有効に
します。このモードでは、存在しない行や列を指定した場合に
HTML_Table が自動的に行や列を追加します。
autoFill
の値
テーブルを作成する際に、すべてのセルに異なる値を指定するというわけではないこともあるでしょう。
そのセルに入れる値が不明であるとか、デフォルト値を指定しておきたい
(例えばユーザについての情報を取得する場合など) といった場合です。
すべてのユーザが携帯電話や email を使っているわけではないでしょう。
そんな場合には、そのセルには "n/a"
を入れなければなりません。
そこで、autoFill
の値として "n/a"
を
定義 し、データが存在するセルにのみ値を設定していきます。
すべてのセルの値を設定する必要はありません。未指定のセルには自動的に
"n/a"
が設定されます。
テーブルの作成
デモンストレーション用データ
これから作成する HTML テーブルには、次のデータを含めるものとします。
<?php
$data = array(
'0' => array('Bakken', 'Stig', '', 'stig@example.com'),
'1' => array('Merz', 'Alexander', 'alex.example.com', 'alex@example.com'),
'2' => array('Daniel', 'Adam', '', '')
);
?>
はじまり
それでは、まず最初に新しい
HTML_Table のインスタンスを作成しましょう。
このテーブルの幅は 600 ピクセルとします。
テーブルに表示するデータの数はわかりません。
そこで、autoGrow
機能を有効にします。
未指定のセルには "n/a"
が表示されるようにします。
<?php
require_once 'HTML/Table.php';
$attrs = array('width' => '600');
$table = new HTML_Table($attrs);
$table->setAutoGrow(true);
$table->setAutoFill('n/a');
?>
setAttributes() メソッドでテーブルの属性を指定することもできます。
つまり、上の例は次のように書くこともできるということです。
<?php
require_once 'HTML/Table.php';
$attrs = array('width' => '600');
$table = new HTML_Table();
$table->setAttributes($attrs);
// [...]
?>
データ行の追加
各データ項目について処理していきます。ここでは、これまで説明してこなかった
HTML_Table の機能を使っており、
一行おきに、行の色が赤くなるようにしています。
<?php
for ($nr = 0; $nr < count($data); $nr++) {
$table->setHeaderContents($nr+1, 0, (string)$nr);
for ($i = 0; $i < 4; $i++) {
if ('' != $data[$nr][$i]) {
$table->setCellContents($nr+1, $i+1, $data[$nr][$i]);
}
}
}
$altRow = array('bgcolor' => 'red');
$table->altRowAttributes(1, null, $altRow);
?>
見出しセルの追加
最初の行に表示され、見出しとして扱われるセルを定義しましょう。
スプレッドシートの表のような仕上がりを想定しているので、
ここでは見出しセルの背景色を "silver" とします。
最初の行には列の見出しをつけ、
最初の列にはデータセットの行番号を表示するようにします。
<?php
$table->setHeaderContents(0, 0, '');
$table->setHeaderContents(0, 1, '姓');
$table->setHeaderContents(0, 2, '名');
$table->setHeaderContents(0, 3, 'ウェブサイト');
$table->setHeaderContents(0, 4, 'EMail');
$hrAttrs = array('bgcolor' => 'silver');
$table->setRowAttributes(0, $hrAttrs, true);
$table->setColAttributes(0, $hrAttrs);
?>
テーブルの表示
さあ、これで出来上がりです! それでは結果を
HTML コードで出力しましょう。
<?php
echo $table->toHtml();
?>
出力結果は次のようになります。
<table width="600">
<tr>
<th bgcolor="silver"> </th>
<th bgcolor="silver">姓</th>
<th bgcolor="silver">名</th>
<th bgcolor="silver">ウェブサイト</th>
<th bgcolor="silver">EMail</th>
</tr>
<tr>
<th bgcolor="silver">0</th>
<td>Bakken</td>
<td>Stig</td>
<td>n/a</td>
<td>stig@example.com</td>
</tr>
<tr>
<th bgcolor="silver">1</th>
<td bgcolor="red">Merz</td>
<td bgcolor="red">Alexander</td>
<td bgcolor="red">alex.example.com</td>
<td bgcolor="red">alex@example.com</td>
</tr>
<tr>
<th bgcolor="silver">2</th>
<td>Daniel</td>
<td>Adam</td>
<td>n/a</td>
<td>n/a</td>
</tr>
</table>
thead、tfoot および tbody の使用
テーブルを thead、tfoot および
tbody のグループに分けたい場合は、
テーブルオブジェクトを取得する際に
getHeader()、
getFooter()
および getBody()
を使用する必要があります。
そして、それを通常のテーブルオブジェクトと同様に使用します。
<?php
$table = new HTML_Table();
$head =& $table->getHeader();
$foot =& $table->getFooter();
$body =& $table->getBody();
$head->setCellContents(...);
$body->setCellContents(...);
echo $table->toHtml();
?>
この例では tfoot グループの中身を設定していません。
そのため、thead および tbody
のみが表示されます。
レンダリングの順序は、まず thead、次に tfoot
そして最後に tbody となります。
これはバグではなく意図的な動作です。なぜなら (X)HTML
の標準規格でそのように定義されているからです。
リリース 1.8.0 以降では、
getBody()
およびその他のメソッド (たとえば
setCellAttributes()
など) でオプションの数値パラメータ $body を受け付けるようになりました。
これを使用すると、テーブル内で複数の tbody
グループを作成できるようになります。新しいグループを作成するには
addBody()
を使用します。あるいはもし
autoGrow
が有効になっているのなら、先ほどのメソッドコールで新しい番号を使用すると自動的にグループが作成されます。