多个URL指向hook_menu中的相同选项卡

时间:2011-01-17 06:40:32

标签: drupal drupal-6 hook-menu

这是我正在使用的基本菜单结构:

function events_menu()
{
    $items = array();

    $items['events'] = array(
        'title' => 'Current Events',
        'access callback' => true,
        'page callback' => 'page_event',
        'type' => MENU_CALLBACK,
    );
      $items['events/current'] = array(
          'access callback' => true,
          'type' => MENU_DEFAULT_LOCAL_TASK,
          'weight' => 1,
      );      
      $items['events/regions'] = array(
          'title' => 'Event By Region',
          'access callback' => true,
          'type' => MENU_LOCAL_TASK,
          'weight' => 2,
      );
      $items['events/range/%/to/%'] = array(
          'title' => 'Current Events by Range',
          'access callback' => true,
          'page callback' => 'page_event_range',
          'page arguments' => array(2, 4),
          'type' => MENU_LOCAL_TASK,
          /* Don't want this to be a tab.
             I want it to activate the default tab */
      );

    return $items;    
}

URL(和默认选项卡)events显示一些数据。我希望网址events/range/%/to/%根据传递的网址参数过滤数据。

上面的hook_menu有效,但我不希望events/range/%/to/%成为它自己的标签。当您使用过滤后的网址时,我希望默认标签“当前事件”保持有效状态 - 假设您正在查看与events相同的页面,只会过滤。多个URL可以指向同一个标签吗?

我想我可以在arg()页面回调中使用events手动处理url参数,但这看起来很糟糕。使用hook_menu是不是有办法做到这一点?

编辑(更清楚地说明):
通常,网址eventsevents/regions有两个标签:Current Events和Event By Region。我想要一个隐藏的(仅回调)网址events/range/%/to/%。但是当你访问它时,我希望两个标签保持可见并且当前事件处于活动状态 - 好像我们从未离开过那个页面。

3 个答案:

答案 0 :(得分:1)

我认为只有使用钩子菜单才能实现你想要的效果。您可以使用menu_set_active_trail制作drupal使其看起来像用户正在查看/events页面。

上述方法可能仅适用于Drupal 7

对于Drupal 6,你可以改变$_GET['q']。但是,这可能与某些模块(如purl或globalredirect)冲突。这不是一个很好的解决方案,但它有效。执行此操作的最佳位置是使用hook_init的自定义模块。

答案 1 :(得分:0)

使用MENU_CALLBACK而不是MENU_LOCAL_TASK,选项卡将消失。然后将当前菜单项设置为'events'(可能只适用于hook_init,但您也可以在页面回调中尝试它:

$item = menu_get_item();
$item['href'] = 'events';
menu_set_item(NULL, $item);

答案 2 :(得分:0)

您是否尝试过“上下文”模块。您可以为活动菜单设置所需的路径模式。看看这个quick video demo.