Drupal の hook (つまりコールバック/Callback)は、その世界観をつかむまでが難しい。以下、モジュール開発を行うときに最低限知っておかなければならない hook をまとめ、管理系 hook とフォーム系 hook に分けてみた。
■管理系 hook
- hook_help($section)
Drupal 5.0 からは yourmodule.info に記述するようになったが、hook_help も実装するように推奨されている。
- hook_perm()
hook_perm と hook_access、hook_menu はセットである。Home > Administer > Access Control でユーザーグループごとのアクセスコントロールを設定するのに必須。
- hook_access($op, $node)
それぞれのアクセス権が、どの操作と対応するかを記述する。操作とは、この関数の引数である $op == 'create'、$op == 'update'、$op == 'delete' などである。
- hook_menu($may_cache)
ここの hook の中でサイトのパスとモジュール、アクセス権、そしてページのタイトルをマッピングして関連付ける。
'type' => MENU_NORMAL_ITEM とすると、メニューシステムに表れるようになる。
'type' => MENU_CALLBACK とすると、メニューシステムに表れず、そのパスを指定すればマッピングされた関数が呼び出されるだけとなる。
- hook_node_info()
以下のように書くと、1つのモジュールファイルの中で2つのフォームを扱える。'module' => 'form1' と'module' => 'form1' とあるのがミソで、form1_view、form2_view など、後述のフォーム系 hook と合わせて form1_ や form2_ を接頭辞として使う。
function hook_node_info() {
return array(
'form1' => array(
'name' => t('form1'),
'module' => 'form1',
'description' => t("form1 の説明をここに書く"),
),
'form2' => array(
'name' => t('form2'),
'module' => 'form2',
'description' => t("form2 の説明をここに書く"),
)
);
}
- hook_admin()
モジュール固有の設定値を、Home > Administer > Site Configuration > Your Module Settings といったようなパスで設定できるようにする。
■フォーム系 hook
ページレンダリング(ページやフォーム表示)を行う。
- hook_form(&$node)
入力フォームを表示する。
- hook_validate($form_id, $form_values)
「submit ボタン」が押されたときに、入力項目をチェックする。不正な文字列や、入力項目が範囲外だったりするとき、form_set_error('ここに項目のフィールド名が入る', t('ここに「エラーです」の文言が入る')); を呼び出してエラーのページを表示できる。
- hook_submit($node)
「submit ボタン」が押されたときに、hook_insert が呼び出される前に呼び出される。insert に渡す $node を変更できる。
- hook_insert($node)
入力フォームから値を受け取り、データベースに保存する。具体的には、この hook の中で SQL の insert 文を発行する。node が新しく追加されることになる。
- hook_update($node)
編集フォーム(入力フォームと同じ)から値を受け取り、データベースにあるレコード(node)を更新する。具体的には、この hook の中で SQL の UPDATE 文を発行する。
- hook_delete(&$node)
編集入力フォーム(入力フォームと同じ)で「削除ボタン」が押されたときに呼び出される。データベースに保存してあった node が削除される。具体的には、この hook の中で SQL の DELETE 文を発行する。
- hook_load($node)
Drupal ではユーザーが作成した文書ひとつひとつは「node」という単位で node テーブルに保存される。node に自分でフィールドを追加した場合は、自身が作成したモジュールが node を表示するときにその追加フィールドを明示的に指定して「load」しておかねばならない。以下のようなコードになる。
function hook_load($node) {
$r = db_fetch_object(
db_query('SELECT `your_id`, `your_field1`, `your_field2`, ... FROM {your_table_name} WHERE nid = %d', $node->nid)
);
return $r;
}
- hook_prepare(&$node)
hook_view を呼び出す前に、node の値を編集できる。たとえば、データベース中には日付時刻のシリアル値を保存しておいて、hook_view で呼び出す前に yyyy/mm/dd という形式に変換して表示したい場合、ここでその日付時刻をフォーマッティングする。
- hook_view(&$node, $teaser = FALSE, $page = FALSE)
node を表示する。yourmodule_prepare を実装した場合は、この hook の始めで呼び出しておく。
function hook_view(&$node, $teaser = FALSE, $page = FALSE) {
$node = node_prepare($node, $teaser);
yourmodule_prepare($node);
...
}
トラックバック URL:
https://perltips.twinkle.cc/trackback/185