web-dev-qa-db-ja.com

hook_menu_alter()が機能していません

作成したモジュールに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;
}
6
Thomas

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() によって呼び出され、次のように呼び出されます。

drupal_flush_all_caches()system_modules_submit() によって呼び出されます。これは、モジュールが有効および無効になっているモジュールページの送信ハンドラです。モジュールが有効または無効になるたびに、メニューが再構築され、両方のメニューフックが呼び出されます。

10
kiamlaluno

要するに:それはします。

関数呼び出しのタイミングのため、印刷はほとんど表示されません。 drupal_set_messageを使用すると、メッセージが表示されます。

その理由は、ページが実際にレンダリングされる前に発生するフォーム送信のアクションの一部としてメニューが再構築されるためです。 drupal_set_messageは、代わりにユーザーセッションに格納されるため、フォーム検証のエラーメッセージと同様に、ページの更新が保持されます。

また、hook_menu_alterは何も返すべきではなく、参照された変数を変更します。これが、すべてのdrupalの*_alterフックが機能する方法です。

3
googletorp

*_alterは、参照によって渡される引数をフックします(この場合は$items)なので、何かを返すのではなく、alter関数から直接出力します。

echo"<pre>";
print_r($items);

キャッシュをクリアします。

配列全体を見ることができます。

1
Harshil