3

モジュールにhook_menuを実装する際に、いくつかの項目をサブメニューに入れようとしています。

これまでのところ、私はこのようなものを持っています

$items['MyModule'] = array(
  //...
  'page callback' => 'system_admin_menu_block_page',
  'file' => 'system.admin.inc',
  'file path' => drupal_get_path('module','system'),
);

$items['MyModule/MenuItem1'] = array(
  //...
);

$items['MyModule/SubMenu'] = array(
  //...
  'page callback' => 'system_admin_menu_block_page',
  'file' => 'system.admin.inc',
  'file path' => drupal_get_path('module','system'),
);

$items['MyModule/SubMenu/SubMenuItem1'] = array(
  //...
);

SubMenuがメニューのサブメニューとして表示され、そのサブメニューの下に が表示されることを期待していMyModuleますSubMenuItemsこれは、 Drupal APIドキュメントで説明されているデフォルトの動作です。

  • マイモジュール
    • メニュー項目1
    • サブメニュー
      • サブメニュー項目1

ただし、すべての項目がMyModuleメニューの下に表示されます。

  • マイモジュール
    • メニュー項目1
    • サブメニュー項目1
    • サブメニュー

私は何を間違っていますか?

SubMenu*編集: の子要素ではなく別の要素になるタイプミス (私が修正しました) MyModuleSubMenuItem1の下でレンダリングしない理由はまだわかりませんSubMenu

4

2 に答える 2

6

問題を再現できません。メニュー階層を使用すると、ナビゲーション メニューの下にすべてのエントリが予想される順序とネストで表示されます。

クリーンな状態 (つまり、モジュールをアンインストールし、メニュー エントリを削除した状態) から (再) 試行しましたか? 私がこれを尋ねる理由を説明するには、少し詳しく説明する必要があります。

Drupal 6 では、メニュー定義ストレージが 2 つのテーブルに分割されました。menu_routerを介して定義されたパス<>コールバック関係を格納するテーブルがありますhook_menu()これは、「実際の」メニュー エントリを定義しません (ナビゲーション メニューなどのメニュー メニューのように)。Drupal の内部メニュー構造を定義するだけで、表示されるメニューとは関係なく、コールバック関数へのパスのマッピングの内部階層だけを定義します。

次にmenu_links、さまざまな表示可能なメニュー (ナビゲーション、プライマリ リンクなど) の下に表示される「実際の」メニュー エントリを格納するテーブルがあります。そこのエントリは、各エントリの「親メニュー ID」(plid) を格納することによってネスト順序も定義し、親エントリを指すか、最上位エントリの場合は 0 を指定します。

を介してパス/コールバックの組み合わせを定義すると、Drupal はそのエントリをテーブルhook_menu()に入れるだけです。menu_routerそれらをMENU_NORMAL_ITEMまたはとして定義するとMENU_SUGGESTED_ITEM、Drupal は追加でテーブルにエントリを作成しようとしmenu_linksます。そのパスのエントリがすでに存在する場合、Drupal はユーザーが意図的に移動したと想定するため、階層内の配置を変更しません。このmenu_linkエントリの作成はhook_menu()、後述の関数を使用して明示的にエントリを追加する手間を省くことができる便利なアドオンと考える必要がありますが、メカニズムはあまり柔軟ではなく、既存の構成に干渉しないようにします (そうでない場合は、手動で編集されたメニューメニューキャッシュが再構築されるたびに常に並べ替えられます)。

したがって、どのパスにも「menu_links」テーブルに既存のエントリがないことを確認しながら、再試行する必要があります。

モジュールのインストール時に適切なデフォルト メニューを提供するという目標のために (そして何が起こっているかをより細かく制御するために)、menu_link_save()およびmenu_link_maintain()関数を調べる必要があります。menu_links をいつ、どのように使用するかについてもお読みください。

于 2009-12-08T20:03:24.867 に答える