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 ,它应该触发第一个片段中定义的页面回调,而是从第二个片段调用页面回调。所以我假设第一个片段中的 hook_alter 实现可能根本不会被调用,但是当我在这个钩子中为 $items array 放置一些调试语句时,它会很好地打印它们,所以这个函数被正确调用但只有这个 alter 中的路径没有得到挂号的。

请让我知道这种行为的原因是什么。提前致谢

4

1 回答 1

0

最好的解决方案是用一两个部分截断你的路径!或者你可以重新定义MENU_MAX_PARTS. 但是为此,您将需要修改核心,我确定您不想这样做,对吧?

于 2013-04-12T04:59:45.317 回答