HTML_Table は、HTML のテーブルを作成するためのインターフェイスを提供するパッケージです。 スプレッドシートのような表形式のデータとともに使用します。 HTML でいちいち順番にセルを書いていくのではなく、 セルの位置を指定してそこにデータを書き込むといったことができるようになります。 最初のセルから書き始めようが、テーブルの途中や最後の行、 列から書き始めようが、まったく同じように操作できます。
autoGrow
フラグ通常は、テーブルの行や列の数は事前にわかっているでしょう。 しかし、時には必要な行や列の数がわからないこともあります。 たとえば、ユーザの入力内容や データベースのクエリの結果を HTML テーブルにする場合などです。
このような場合は、autoGrow
機能を
有効に
します。このモードでは、存在しない行や列を指定した場合に
HTML_Table が自動的に行や列を追加します。
autoFill
の値
テーブルを作成する際に、すべてのセルに異なる値を指定するというわけではないこともあるでしょう。
そのセルに入れる値が不明であるとか、デフォルト値を指定しておきたい
(例えばユーザについての情報を取得する場合など) といった場合です。
すべてのユーザが携帯電話や email を使っているわけではないでしょう。
そんな場合には、そのセルには "n/a"
を入れなければなりません。
そこで、autoFill
の値として "n/a"
を
定義 し、データが存在するセルにのみ値を設定していきます。
すべてのセルの値を設定する必要はありません。未指定のセルには自動的に
"n/a"
が設定されます。
これから作成する HTML テーブルには、次のデータを含めるものとします。
<?php
$data = array(
'0' => array('Bakken', 'Stig', '', '[email protected]'),
'1' => array('Merz', 'Alexander', 'alex.example.com', '[email protected]'),
'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();
?>
出力結果は次のようになります。
テーブルを 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
が有効になっているのなら、先ほどのメソッドコールで新しい番号を使用すると自動的にグループが作成されます。