導入

導入 -- HTML テーブルの作成

HTML_Table とは?

HTML_Table は、HTML のテーブルを作成するためのインターフェイスを提供するパッケージです。 スプレッドシートのような表形式のデータとともに使用します。 HTML でいちいち順番にセルを書いていくのではなく、 セルの位置を指定してそこにデータを書き込むといったことができるようになります。 最初のセルから書き始めようが、テーブルの途中や最後の行、 列から書き始めようが、まったく同じように操作できます。

autoGrow および autoFill の値

autoGrow フラグ

通常は、テーブルの行や列の数は事前にわかっているでしょう。 しかし、時には必要な行や列の数がわからないこともあります。 たとえば、ユーザの入力内容や データベースのクエリの結果を HTML テーブルにする場合などです。

このような場合は、autoGrow 機能を 有効に します。このモードでは、存在しない行や列を指定した場合に HTML_Table が自動的に行や列を追加します。

autoFill の値

テーブルを作成する際に、すべてのセルに異なる値を指定するというわけではないこともあるでしょう。 そのセルに入れる値が不明であるとか、デフォルト値を指定しておきたい (例えばユーザについての情報を取得する場合など) といった場合です。 すべてのユーザが携帯電話や email を使っているわけではないでしょう。 そんな場合には、そのセルには "n/a" を入れなければなりません。

そこで、autoFill の値として "n/a" 定義 し、データが存在するセルにのみ値を設定していきます。 すべてのセルの値を設定する必要はありません。未指定のセルには自動的に "n/a" が設定されます。

テーブルの作成

デモンストレーション用データ

これから作成する HTML テーブルには、次のデータを含めるものとします。
$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" が表示されるようにします。
require_once 'HTML/Table.php';

$attrs = array('width' => '600');
$table = new HTML_Table($attrs);
$table->setAutoGrow(true);
$table->setAutoFill('n/a');
setAttributes() メソッドでテーブルの属性を指定することもできます。 つまり、上の例は次のように書くこともできるということです。
require_once 'HTML/Table.php';

$attrs = array('width' => '600');
$table = new HTML_Table();
$table->setAttributes($attrs);
// [...]

データ行の追加

各データ項目について処理していきます。ここでは、これまで説明してこなかった HTML_Table の機能を使っており、 一行おきに、行の色が赤くなるようにしています。
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" とします。 最初の行には列の見出しをつけ、 最初の列にはデータセットの行番号を表示するようにします。
$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 コードで出力しましょう。
echo $table->toHtml();
出力結果は次のようになります。
<table width="600">
  <tr>
    <th bgcolor="silver">&nbsp;</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 の使用

テーブルを theadtfoot および tbody のグループに分けたい場合は、 テーブルオブジェクトを取得する際に getHeader()getFooter() および getBody() を使用する必要があります。 そして、それを通常のテーブルオブジェクトと同様に使用します。
$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 が有効になっているのなら、先ほどのメソッドコールで新しい番号を使用すると自動的にグループが作成されます。