2008年11月24日月曜日

Drupal で PHP snippets - 最新のストーリーのタイトル一覧を表示

1. 標準で用意されている PHP snippets を利用する

Drupal で表示をカスタマイズするには、Views モジュールを使うのが良い。

今回、このモジュールを使わずに、標準で用意されている PHP をコンテンツの作成で埋め込む方法について調べる。

予め Drupal でコンテンツの作成において PHP コードを埋め込む ことができるように PHP filter モジュールを有効にしておく。これにより、コンテンツの作成において PHP を埋め込むことが可能となる。

には、PHP を利用してデータを表示するためのサンプルがいくつか載っている。

 

2. 予めチェックしておくドキュメント

PHP を利用してコンテンツを抽出・表示するには、

  1. SQL を記述
  2. データの取得
  3. 表示

という 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

によって内容を表示する。引数の説明によると、

Parameters

$hook The name of the theme function to call.

この hook の辺り、どのような仕組みになっているのかわからない。 (+_+) 上記の場合だと、theme.inc に書かれている theme_item_list() が呼出されるということなのかな? QQQ

 

関連記事