hook_menu Drupal 7 モジュールによるページ作成
前のレッスンでは、Drupal API、具体的にはフック hook_block_info() と hook_block_view() を使って、データベースから情報を表示する方法を見ました。このレッスンでは、hook_menu() フックを使ってページを表示し、ページをメニュー、翻訳モジュール、テンプレートなど Drupal の他の部分に接続します。
簡単なことから始めましょう:最新 10 件のニュース記事のタイトルと説明を表示します。これで小さなニュースフィードができます。hook_menu() フックを使います。まず説明し、続いて実装します。
hook_menu()
メニュー項目を定義し、ページを返します。
このフックはモジュール内で呼び出され、Drupal によって処理されるパスを登録します。パスは処理専用の場合も、ナビゲーションメニューのようなメニューに表示される場合もあります。パスとそれに関連するメタデータは「メニュールーター項目」として知られています。このフックはまれに(たとえばモジュールが有効化されたときに)呼び出され、その結果はデータベースにキャッシュされます。したがって、このフックを更新したときはキャッシュをクリアする必要があります。
hook_menu() は、キーがパスで、値が各パスのプロパティの連想配列(以下で説明)である連想配列を返します。
各パスの定義には page callback が含まれ、登録されたパスがリクエストされたときにコンテンツを返します。たとえば、モジュールがパス 'abc/def' を登録できます。
'mymodule_abc_view',
);
return $items;
}
function mymodule_abc_view($ghi = 0, $jkl = '') {
// ...
}
?>
パス 'abc/def' がリクエストされ、URL に追加のセグメントがない場合、追加の引数は渡されません。'abc/def/1/Omsk' がリクエストされると、値「1」と「Omsk」がコールバックに渡されます。これはページテンプレートを作成するときに役立ちます。
追加の引数は配列を使って渡せます。配列には数値インデックスとリテラル値を含められます。数値が使われると、Drupal は URL の対応する引数をコールバック関数に渡します。たとえば、最初のセグメントは arg(0)、2 番目は arg(1) というように取得できます。
'mymodule_abc_view',
'page arguments' => array(1, 'foo'),
);
return $items;
}
?>
パス 'abc/def' が呼び出されると、コールバックは最初の引数として 'def' を、2 番目の引数として常に 'foo' を受け取ります。フックの完全なドキュメントはこちらで入手できます:hook_menu API リファレンス。
簡単なページを作成しましょう:
function sitemade_menu(){
$items = array();
$items['page_example'] = array(
'title' => 'Page Example',
'description' => 'A simple page',
'page callback' => '_page_example',
'access callback' => TRUE,
'expanded' => TRUE,
);
return $items;
}
function _page_example($content = NULL) {
$content = '';
$query = db_select('node_revision', 'n');
$query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid');
$query->innerJoin('node', 'd', 'n.nid = d.nid');
$query->fields('n', array('title'), array('nid'), array('vid'));
$query->fields('b', array('body_value'));
$query->condition('d.type', 'news');
$query->orderBy('n.timestamp', 'DESC');
$query->range(0, 10);
$result = $query->execute();
while($nodes = $result->fetch()) {
$content .= '' . $nodes->title . '
';
$content .= $nodes->body_value;
}
return $content;
}
type プロパティを使って、ページを管理メニューやメインメニューなどのさまざまなメニューに表示することもできます。
やってみましょう:
function sitemade_menu(){
$items = array();
$items['page_example'] = array(
'title' => 'Page Example',
'description' => 'A simple page',
'page callback' => '_page_example',
'access callback' => TRUE,
'expanded' => TRUE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'main-menu',
);
return $items;
}
キャッシュをクリアすると、このページへのメニューリンクが表示されます:

標準のメニュー項目のほかに、ページを Drupal の管理エリアに表示できます:
function sitemade_menu(){
$items = array();
$items['admin/config/content/page_example'] = array(
'title' => 'Page Example',
'description' => 'A simple page',
'page callback' => '_page_example',
'access arguments' => array('administer site configuration'),
);
return $items;
}
これで、ページは管理者にのみ表示され、そのリンクが管理インターフェースに表示されます:

リンクが管理インターフェースに表示されるのは、Drupal が自動的にリンクを admin/config/content/* の下に配置するためです。これを admin/config/people/* に変更すると、リンクは Users セクションの下に表示されます(* をあなたのパス、たとえば page_example に置き換えます)。
これで、ブロックとページの作成方法がわかりました。これらはコンテンツを表示するための不可欠なフックで、あなたのモジュールに頻繁に登場します。
次のレッスンでは、新しいユーザー権限を作成するための hook_perm() を探ります。