Drupal 7 でのデータベース操作 - レッスン 9 - UPDATE クエリ
更新クエリは常にクエリビルダーを使うべきです。データベースによって LOB(Large Object、MySQL の TEXT など)や BLOB(Binary Large Object)フィールドの特定のハンドラーが異なるため、個々のデータベースドライバーがこれらの特有の処理を実装できるように、抽象化レイヤーが必要です。
更新クエリは db_update() 関数で始める必要があります:
<?php $query = db_update('node', $options);
?>
この更新クエリオブジェクトを作成することで、node テーブルの 1 つ以上のレコードを変更します。波括弧は不要であることに注意してください――クエリビルダーが自動的にテーブル名を処理します。
更新クエリオブジェクトは Fluent API を使います。つまり、(execute() を除く)すべてのメソッドがクエリオブジェクト自体を返し、メソッドチェーンを可能にします。多くの場合、これはクエリを変数に格納する必要がないことを意味します。
Drupal 7 でのデータベース操作 - レッスン 10 - 削除クエリ(DELETE)
削除クエリはクエリビルダーを使うべきです。db_delete() 関数で始まります:
この削除クエリは、node テーブルからレコードを削除します。テーブル名を波括弧で囲む必要はないことに注意してください――Drupal のクエリビルダーが自動的に処理します。削除クエリは Fluent API を使い、(execute() を除く)すべてのメソッドが、update や insert クエリと同じように、クエリオブジェクト自体を返します。
削除クエリはシンプルで、WHERE 式のみを使います。WHERE 条件については今後のレッスンでさらに詳しく扱いますが、ここでは基本的な削除クエリを見てみましょう:
Drupal 7 でのデータベース操作 - レッスン 11 - MERGE クエリ
マージクエリは、データベースクエリの特殊なハイブリッド型です。これらのクエリの構文は SQL 2003 で定義されましたが、実際にサポートしているデータベースはわずかです。しかし、ほとんどのデータベースは特定の構文を使った代替実装を提供しています。Drupal のマージクエリビルダーは、マージクエリの概念をオブジェクト構造に抽象化するため、各データベースの独自の構文に基づいて適切にコンパイルできます。
一般に、マージクエリは insert クエリと update クエリの組み合わせです。条件が満たされる場合――つまり特定のキーを持つ行がすでに存在する場合――一方のクエリ(通常は UPDATE)が実行されます。そうでない場合は、もう一方(通常は INSERT)が実行されます。これは次に似ています:
Drupal 7 でのデータベース操作 - レッスン 12 - クエリ条件(WHERE、HAVING、LIKE)
クエリの WHERE 句を使うと、特定の条件を満たすレコードだけを選択できます――たとえば、2 週間前より後に作成されたノードや、「Drupal」という語を含むタクソノミー用語などです。SQL では、SELECT、UPDATE、DELETE クエリで条件を指定するために WHERE と HAVING を使います。Drupal の動的クエリには、クエリ条件を扱う組み込みの仕組みがあり、SELECT、UPDATE、DELETE の操作で同じように機能します。
条件式の概念
条件は、制約を定義する特別な式として表されます。
条件の結合
各条件は、論理演算子 AND と OR を使って組み合わせた複数の条件式で構成できます。
条件オブジェクト
Drupal は各条件フラグメントを QueryCondition クラスのインスタンスとして表します。すべての条件オブジェクトは QueryCondition インスタンスです。
SQL クエリの例:
Drupal でモジュールを作成する、クイックスタート
api.drupal.org から始めましょう。ノードが保存される前にトリガーされる hook_node_validate() フックのページを開きます:
http://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_validate/7
フックを使うと、通常の Drupal の処理に独自のコードを注入できます――検証、データフィールド、フォーム要素などを追加できます。
カスタムモジュールを sites/all/modules ディレクトリに追加しましょう:
Drupal 7 モジュールは何で構成されているか?
モジュールの作成を始める前に、Drupal API の機能についてもう少しお話ししたいと思います。API は、タクソノミー、ノード、ユーザー、データベースの入出力を扱う強力なツールを提供します。モジュールと Drupal コアの間、あるいは異なるモジュール間の通信を可能にするために、Drupal はフックシステムを提供しています。フックはコールバックです:コードの実行がフックに達すると、モジュールの関数が実行フローに組み込まれます。これにより、ユーザーデータ、メニュー、タクソノミー、コンテンツタイプを処理できます。
こちらを訪れてください:
http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7
Drupal 7 hook_block_info() と hook_block_view() ブロックに情報を表示する
前のレッスンでは、Drupal 7 用のモジュールを作成しました。このレッスンでは、引き続きモジュールを強化していきます。hook_block_info() と hook_block_view() を使ってブロック出力を追加します。このブロックは、サイトの最新ユーザーを、それぞれのプロフィールページへのリンク付きで表示します。
まず、hook_block_info() の説明から始めましょう:
モジュールが作成するすべてのブロックを定義します。
このフックは、モジュールがどのブロックを表示するかを Drupal に伝え、ブロックの設定オプションを記述することもできます。
hook_block_info() では、各ブロックに「delta」と呼ばれる一意の識別子(返される配列のキー)が割り当てられます。delta の値はモジュール内で一意でなければならず、次の用途に使われます:
hook_menu Drupal 7 モジュールによるページ作成
前のレッスンでは、Drupal API、具体的にはフック hook_block_info() と hook_block_view() を使って、データベースから情報を表示する方法を見ました。このレッスンでは、hook_menu() フックを使ってページを表示し、ページをメニュー、翻訳モジュール、テンプレートなど Drupal の他の部分に接続します。
簡単なことから始めましょう:最新 10 件のニュース記事のタイトルと説明を表示します。これで小さなニュースフィードができます。hook_menu() フックを使います。まず説明し、続いて実装します。
hook_menu()
メニュー項目を定義し、ページを返します。
hook_permission Drupal 7 さまざまなロールのアクセス権限
これまでのレッスンで、さまざまな場所にページやブロックを表示し、また 'access arguments' と 'access callback' プロパティを使ってページのアクセス制限を設定しました。このレッスンでは、管理ページを通じて操作へのアクセス権をより柔軟に管理する方法を作成します。そのために、hook_permission()(Drupal 6 では hook_perm() でした)を使います。
hook_permission()
ユーザーの権限を定義します。
このフックは権限を追加でき、モジュールがユーザー権限ページでどれを選択可能にするかを指定できます。また、モジュールが実行するアクションへのアクセスを完全にまたは部分的に制御するのにも使われます。
権限は user_access() を使ってチェックされます。
戻り値
キーが権限名で、値が次のキーと値のペアを含む配列である、配列です:
Form API Drupal 7 Drupal でのフォーム作成
これまでのレッスンで、フック hook_block_info()、hook_block_view()、hook_menu()、hook_permission() に触れ、今ではプログラムで必要なだけのページやブロックを作成できるようになりました。このレッスンでは、フォームを作成するための Drupal 7 の Form API を探ります。モジュール機能を管理するためのフォームを構築し、これまで学んだフックをできるだけ多く使ってスキルを固めていきます。
手始めに、3 つのブロックを表示します。これはあなたにとって難しくないはずです。