2

hook_menu_alter で新しいパスを追加していますが、このパスにアクセスすると、適切なページ コールバックがトリガーされません。drupal core の menu_execute_active_handler 関数によってどの router_item が選択されているかを調べると、最後の 1 つのパス引数がない親パスが出力されます。これが私がmenu_alterを持っている方法です。

function mainlist_slot_menu_alter(&$items) {
   $items['user/%user/categories/bird/list/%/%ctools_js/%']  = array(
     'title'    => 'Mainlist slot fulfiller',
     'page callback'  => 'mainlist_slot',
     'page arguments' => array(1, 5, 6,7),
     'access callback'=> 'mainlist_slot_access',
     'access arguments' => array(1,5,7)
  );
}

他のモジュールも hook_menu_alter を実装しています

function mainlist_menu_alter(&$items){
 $items['user/%user/categories/bird/list/%mainlist'] = array(
  'title callback' => 'mainlist_title',
  'title arguments'=> array(5),
  'description'    => 'Page showing mainlist for referenced user',
  'page callback' =>'mainlist_view',
  'page arguments' => array(5),
  'load arguments' => array(1),
  'access callback' => 'mainlist_access',
  'access arguments' => array(1,5),
  'type' => MENU_CALLBACK,
 )
);

したがって、パスにアクセスするuser/1/categories/bird/list/1/nojs/91 と、最初のスニペットで定義されたページ コールバックがトリガーされるはずですが、代わりに 2 番目のスニペットからページ コールバックが呼び出されます。したがって、最初のスニペットの hook_alter 実装はまったく呼び出されない可能性があると想定しましたが、 $items array のこのフックにいくつかのデバッグステートメントを入れると、それらがうまく出力されるため、この関数は適切に呼び出されますが、この変更のパスのみが取得されません登録済み。

この動作の理由を教えてください。前もって感謝します

4

1 に答える 1

0

最善の解決策は、パスを 1 つまたは 2 つの部分で切り詰めることです。または、再定義することもできますMENU_MAX_PARTS。しかし、そのためには、コアを変更する必要があります。あなたはそれをしたくないと思いますよね?

于 2013-04-12T04:59:45.317 に答える