前回「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 関数を使わずにソースに直接日本語を書いた。