1

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

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显示一些数据。我希望 URLevents/range/%/to/%根据传递的 URL 参数过滤数据。

上面的 hook_menu 有效,但我不想events/range/%/to/%成为它自己的选项卡。当您使用过滤后的 URL 时,我希望默认选项卡 Current Events 保持活动状态 - 给人一种您正在查看与 相同的页面的错觉events,只是过滤了。多个 URL 可以指向同一个选项卡吗?

arg()我想我可以在页面回调中手动处理 url 参数events,但这似乎很棘手。没有办法使用 hook_menu 做到这一点吗?

编辑(说明更清楚):
通常在 URLeventsevents/regions. 我想要一个隐藏的(仅限回调)网址events/range/%/to/%。但是当您访问它时,我希望这两个选项卡保持可见并且当前事件处于活动状态 - 就好像我们从未离开过该页面一样。

4

3 回答 3

1

我认为仅使用挂钩菜单不可能完成您想要的。你可以做什么menu_set_active_trail来使drupal看起来像用户正在查看/events页面。

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

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

于 2011-01-17T09:03:37.630 回答
0

使用 MENU_CALLBACK 而不是 MENU_LOCAL_TASK,选项卡将消失。然后像这样将当前菜单项设置为“事件”(可能仅在 hook_init 中有效,但您也可以在页面回调中尝试:

$item = menu_get_item();
$item['href'] = 'events';
menu_set_item(NULL, $item);
于 2011-01-17T15:20:41.497 回答
0

您是否尝试过“上下文”模块。您可以为活动菜单设置所需的路径模式。查看此快速视频演示。

于 2011-01-19T04:40:05.140 回答