作成したモジュールにhook_menu_alter()
を実装しました。同じモジュールから関数hook_init()
が実行されていますが、その関数呼び出しの中に何かを出力しましたが、何も表示されません。 hook_init()
の出力はページに表示されますが、キャッシュをクリアした後でもhook_menu_alter()
からは出力されません。
誰かがこの問題について何か考えを持っていますか?
function mymodule_init(){
print "here";
}
function mymodule_menu_alter(&$items) {
print "I am here";
return $items;
}
hook_menu()
およびhook_menu_alter()
は常に呼び出されるわけではありません。 Drupalモジュールが有効化、無効化、更新されたときなど、メニューが再構築されたとき、またはDrupalキャッシュがクリアされたときにのみ呼び出されます。
hook_menuの構造 は次の文を報告します。
hook_menu()
は、モジュールが有効な場合など、まれに呼び出されます。モジュールのhook_menu()
を編集する場合、変更を有効にするにはadmin/build/modulesにアクセスする必要があります。
hook_menu()
およびhook_menu_alter()
の実装を呼び出す関数は menu_router_build() であり、このコードが含まれています(コードはDrupal 7):
_function menu_router_build() {
// We need to manually call each module so that we can know which module
// a given item came from.
$callbacks = array();
foreach (module_implements('menu') as $module) {
$router_items = call_user_func($module . '_menu');
if (isset($router_items) && is_array($router_items)) {
foreach (array_keys($router_items) as $path) {
$router_items[$path]['module'] = $module;
}
$callbacks = array_merge($callbacks, $router_items);
}
}
// Alter the menu as defined in modules, keys are like user/%user.
drupal_alter('menu', $callbacks);
list($menu, $masks) = _menu_router_build($callbacks);
_menu_router_cache($menu);
return array($menu, $masks);
}
_
関数は menu_rebuild() によって呼び出され、次のように呼び出されます。
hook_enable()
の実装hook_uninstall()
の実装drupal_flush_all_caches()
は system_modules_submit() によって呼び出されます。これは、モジュールが有効および無効になっているモジュールページの送信ハンドラです。モジュールが有効または無効になるたびに、メニューが再構築され、両方のメニューフックが呼び出されます。
要するに:それはします。
関数呼び出しのタイミングのため、印刷はほとんど表示されません。 drupal_set_message
を使用すると、メッセージが表示されます。
その理由は、ページが実際にレンダリングされる前に発生するフォーム送信のアクションの一部としてメニューが再構築されるためです。 drupal_set_message
は、代わりにユーザーセッションに格納されるため、フォーム検証のエラーメッセージと同様に、ページの更新が保持されます。
また、hook_menu_alter
は何も返すべきではなく、参照された変数を変更します。これが、すべてのdrupalの*_alter
フックが機能する方法です。
*_alter
は、参照によって渡される引数をフックします(この場合は$items
)なので、何かを返すのではなく、alter関数から直接出力します。
echo"<pre>";
print_r($items);
キャッシュをクリアします。
配列全体を見ることができます。