Несколько URL-адресов, указывающих на одну и ту же вкладку в 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
отображает некоторые данные. Я хотел бы URL events/range/%/to/%
фильтровать данные на основе переданных параметров URL.
Меню hook_menu выше работает, но я не хочу events/range/%/to/%
быть его собственной вкладкой. Когда вы используете отфильтрованный URL-адрес, я хочу, чтобы вкладка по умолчанию "Текущие события" оставалась активной - чтобы создать иллюзию того, что вы просматриваете ту же страницу, что и events
только фильтруется. Могут ли несколько URL указывать на одну и ту же вкладку?
Я думаю, я мог бы обработать параметры URL вручную arg()
в events
обратный вызов страницы, но это кажется взломанным. Разве нет способа сделать это с помощью hook_menu?
Изменить (указано более четко):
Обычно есть две вкладки "Текущие события" и "События по регионам" в URL. events
а также events/regions
, Я хочу скрытый (только обратный вызов) URL на events/range/%/to/%
, Но когда вы посещаете его, я хочу, чтобы две вкладки оставались видимыми и текущие события были активными - как если бы мы никогда не покидали эту страницу.
3 ответа
Я не думаю, что можно выполнить то, что вы хотите, только с помощью меню хуков. Что вы могли бы сделать это использовать menu_set_active_trail
чтобы заставить drupal сделать так, чтобы пользователи смотрели на /events
стр.
Вышеуказанный метод может работать только для Drupal 7
Для Drupal 6 вы можете изменить $_GET['q']
, Это может, однако, конфликтовать с некоторыми модулями, такими как purl или globalredirect. Это не симпатичное решение, но оно работает. Лучшее место для этого было бы в пользовательском модуле, использующем hook_init
,
Вы пробовали "контекстный" модуль. Вы можете установить шаблон пути, который вы хотите для активного меню. Проверьте это быстрое видео демо.
Используйте MENU_CALLBACK вместо MENU_LOCAL_TASK, и вкладка исчезнет. Затем установите текущий пункт меню на "события", например, так (может работать только в hook_init, но вы можете попробовать это и в обратном вызове страницы:
$item = menu_get_item();
$item['href'] = 'events';
menu_set_item(NULL, $item);