2008年11月26日水曜日

Drupal で PHP snippets (3) - テーブルで出力

前回「Drupal で PHP snippets - 最新のストーリーのタイトル一覧を表示」では結果をリストとして表示した。今回はこれをテーブルで表示したい。

 

theme 関数

Drupal では theme 関数を使ってテンプレートに即したデザインを出力することができる。前回、リストとして表示されたのは PHP snippets の以下の部分による。

theme('item_list', $items);

この辺りどういう仕組みか理解していないが、theme | Drupal API によると、

All requests for theme hooks must go through this function.

theme 関数がテンプレートを利用するための窓口になっているようだ。

Default theme implementations | Drupal API には、theme 関数の使い方の例が書かれていた。

For example, theme('table', $header, $rows); Additionally, the theme() function can take an array of theme hooks, which can be used to provide 'fallback' implementations to allow for more specific control of output. For example, the function: theme(array('table__foo', 'table'), $header, $rows) would look to see if 'table__foo' is registered anywhere; if it is not, it would 'fall back' to the generic 'table' implementation.

(太字は引用者による)

theme 関数の第1引数で表示の仕方を指定するようだ。その際、いろいろと細かな指定ができるようだけれど、それは横に置いておく。とにかく、

theme('table', $header, $rows);

というように記述することができる。前回との違いは、theme 関数の第1引数に指定している文字列が ‘item_list’ から ‘table’ に変化しいるところ。この ‘table’ というのが HTML の table 要素の出力に対応。

PHP snippets の中で、テーブルを出力する Display a table of node entries sorted by a start date taken from the event module の例を見ても、

print theme('table', array(…

というように第1引数に 'table’ と指定しているので、やはりこれがテーブルの出力に関与しているようだ。

 

theme_… 関数

Default theme implementations | Drupal API の関数の一覧の中に次の関数がある。

接頭辞 `theme_’ を取り除けば、上記で指定した item_list, table に対応。よくわからないが、この辺りを theme 関数が窓口となって呼出しているようだ。ソースを見るとそんな感じ。

 

前回は、リストの内容として「ストーリーのタイトルの一覧」を表示した。今回テーブルに表示する内容は、タイトルに加えて「コンテンツが作成された日付」も表示するようにしてみる。

テーブルとして表示するには、theme(‘table’,… とする。第2引数以降は、theme_table | Drupal API によると、

$header An array containing the table headers. …

  • "data": The localized title of the table column.

$rows An array of table rows. …
  • "data": an array of cells

02:モジュールのベース部分を作成 | Neoceed には、theme(‘table’ … の例が書かれていたので、これを参考にした。

    $header = array(array('data' => '氏名'), array('data' => '電話番号'), array('data' => '住所'));
    $result = db_query("SELECT * FROM {maddress}");
    while ($record = db_fetch_array($result)) {
        $rows[] = array(
            array('data' => $record["name"]),
            array('data' => $record["tel"]),
            array('data' => $record["address"])
        );

上記のドキュメントにあったように ‘data’ と対応させてテーブルの内容を指定しているのがわかった。

日付の出力にいては、Aggregator headline display with date の例を見たら、date 関数によって書式が指定されていた。これは PHP で用意されている関数なので PHP: date – Manual を参照。

 

コード例

<?php
$sql ="
	SELECT n.nid, n.title, n.created 
	FROM {node} n 
	WHERE n.type = 'story' 
	AND n.status = 1 
	ORDER BY n.created DESC
";

// テーブルのヘッダ
$header = array(array('data' => 'タイトル'),
				array('data' => '日付'));
// テーブルの内容
$rows = array();

// クエリの実行 
$result = db_query_range($sql, 0, 5);
// 各々のデータを取得
while ($node = db_fetch_object($result)) {
	$rows[] = array(
		array('data' => l($node->title, "node/$node->nid")),
		array('data' => date("Y/m/d", $node->created)));
}
if(count($rows)){
	return theme('table', $header, $rows);
}else{
	return 'ストーリーがありません。';
}
?>

今回は t 関数を使わずにソースに直接日本語を書いた。