1. 標準で用意されている PHP snippets を利用する
Drupal で表示をカスタマイズするには、Views モジュールを使うのが良い。
今回、このモジュールを使わずに、標準で用意されている PHP をコンテンツの作成で埋め込む方法について調べる。
予め Drupal でコンテンツの作成において PHP コードを埋め込む ことができるように PHP filter モジュールを有効にしておく。これにより、コンテンツの作成において PHP を埋め込むことが可能となる。
には、PHP を利用してデータを表示するためのサンプルがいくつか載っている。
2. 予めチェックしておくドキュメント
PHP を利用してコンテンツを抽出・表示するには、
- SQL を記述
- データの取得
- 表示
という 3 つの手順を踏む必要がある。
Drupal では、コードの可搬性・セキュリティを考慮した
がある。この API を利用して DB にアクセスする。
DB にアクセスするには、データベースの構造を理解する必要がある。
には、代表的なテーブルの構造が説明されている。この中で重要なのは、
Drupal では、ノードに様々なコンテンツが保存される形になっている。
取得したデータを表示するには
を利用する。
3. 例題
最近投稿したコンテンツタイプ「ストーリー」のタイトルの一覧を、リストとして表示したい。
ただし、一覧に表示する数の上限は 5 つ。
4. コード例 1
PHP snippets にある、以下のコードを真似した。 (ただし、6.x では動かない。)
<?php $sql =" SELECT n.title FROM {node} n WHERE n.type = 'story' AND n.status = 1 ORDER BY n.created DESC "; $result = db_query_range($sql, 0, 5); if(db_num_rows($result)){ return node_title_list($result); } return t('No nodes available.'); ?>
a. node テーブル
ストーリーはコンテンツの一種であり、コンテンツは node テーブルに保存される。
を参照しながら SQL を作成する。
SQL 内でテーブルを参照するときに使われている { } は、Database abstraction layer によると、
Curly braces are used around "node" to provide table prefixing via db_prefix_tables().
同一の DB に複数のシステムをインストールしている場合、テーブル名に何らかの接頭辞を使うことが多い。上記の記述によってこれを補ってくれる。
b. データの取得 : db_query_range
DB にアクセスするには
が基本となる。SQL で LIMIT を書かずに関数のパラメータとして与えるのが
範囲を指定するには、第2、第3引数に数値を与える。
$from The first result row to return.
$count The maximum number of result rows to return.
c. node のタイトルをリンクへ : node_title_list
今回は、node のタイトルの一覧を取得したい。そのため、node モジュールの
関数を利用した。
を使うと、クエリの結果を一気に node のタイトルのリンクに変更できる。
d. 各言語で表示
は、各々の言語で表示する文字列を変化させるために用いる。
e. db_num_rows は 6.x で廃止
しかし、Remove db_num_rows() method によると、
The db_num_rows() method was removed from the database abstraction layer in 6.x core, as it was a database dependent method.
db_num_rows() メソッドが削除されているよ。上記のコードは 6.6 では動作しなかった。(+_+)
5. コード例 2
以下の PHP snippets を参考にして作成した。
<?php $sql =" SELECT n.nid, n.title FROM {node} n WHERE n.type = 'story' AND n.status = 1 ORDER BY n.created DESC "; $items = array(); $result = db_query_range($sql, 0, 5); while ($node = db_fetch_object($result)) { $items[] = l($node->title, "node/$node->nid"); } if(count($items)){ return theme('item_list', $items); }else{ return t('No nodes available.'); } ?>
a. データを一件ずつ取得 : db_fetch_object
によって node オブジェクトを取得。
Fetch one result row from the previous query as an object.
b. リンクを作成 : l
各々の node オブジェクトを取得し、
l メソッド
によって node へのリンクを作成する。
コンテンツは
http://XXXXX.xrea.jp/node/nid
という形式で参照できる。そのため、SQL においてタイトルだけではなく nid も取得した。
は、与えられた文字列と URL からリンクを生成してくれる。上記では、DB から取得した node のタイトルと、その node への URL からリンクを作成した。
c. 内容の表示 : theme
- theme 関数
によって内容を表示する。引数の説明によると、
Parameters
$hook The name of the theme function to call.
この hook の辺り、どのような仕組みになっているのかわからない。 (+_+) 上記の場合だと、theme.inc に書かれている theme_item_list() が呼出されるということなのかな? QQQ
関連記事
- Drupal で PHP snippets (2) - インターフェイスの翻訳
- Drupal で PHP snippets (3) - テーブルで出力
- Drupal の Views モジュールで最新のストーリーのタイトル一覧を表示
0コメント:
コメントを投稿