这是我正在使用的基本菜单结构:
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是不是有办法做到这一点?
编辑(更清楚地说明):
通常,网址events
和events/regions
有两个标签:Current Events和Event By Region。我想要一个隐藏的(仅回调)网址events/range/%/to/%
。但是当你访问它时,我希望两个标签保持可见并且当前事件处于活动状态 - 好像我们从未离开过那个页面。
答案 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.