前回「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 関数を使わずにソースに直接日本語を書いた。
0コメント:
コメントを投稿