Несколько 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/%. Но когда вы посещаете его, я хочу, чтобы две вкладки оставались видимыми, а текущие события активными, как будто мы никогда не покидали эту страницу.


person ack    schedule 17.01.2011    source источник


Ответы (3)


Я не думаю, что можно добиться того, чего вы хотите, только с помощью меню крючков. Что вы можете сделать, используйте menu_set_active_trail для сделать drupal таким, чтобы пользователи смотрели на страницу /events.

Вышеупомянутый метод может работать только для Drupal 7.

Для Drupal 6 вы можете изменить $_GET['q']. Однако это может конфликтовать с некоторыми модулями, такими как purl или globalredirect. Это не красивое решение, но оно работает. Лучше всего это сделать в пользовательском модуле с использованием hook_init.

person googletorp    schedule 17.01.2011
comment
Я вижу, как эта функция может изменить мою навигационную цепочку, но я не понимаю, как это относится к моей проблеме: отображение двух вкладок по отфильтрованному URL-адресу, при этом активная вкладка является вкладкой по умолчанию. - person ack; 17.01.2011
comment
@AK: активный след используется не только для хлебных крошек, но и для определения того, какой пункт меню (вкладка) должен отображаться активным. Если бы вы действительно попробовали это, вы бы увидели, что это работает. - person googletorp; 18.01.2011
comment
@AK: Я сделал это сам в D7, чтобы обойти ошибку в ядре Drupal. На самом деле я не проверял это в D6, и система меню не сильно изменилась. Но есть вероятность, что это просто не будет работать в D6. - person googletorp; 19.01.2011
comment
Увидев использование в пользователе .pages.inc, я получил это, работая с menu_set_active_item(), которое, как я вижу, является просто оболочкой для изменения $_GET['q'] - person ack; 31.01.2011

Используйте MENU_CALLBACK вместо MENU_LOCAL_TASK, и вкладка исчезнет. Затем установите текущий пункт меню на «события» следующим образом (может работать только в hook_init, но вы также можете попробовать это в обратном вызове страницы:

$item = menu_get_item();
$item['href'] = 'events';
menu_set_item(NULL, $item);
person drifteaur    schedule 17.01.2011
comment
Хм, не заставить это сделать что-либо ни в hook_init, ни в обратном вызове страницы... посмотрев глубже на menu_set_item... - person ack; 17.01.2011

Вы пробовали модуль «контекст». Вы можете установить желаемый шаблон пути для активного меню. Посмотрите этот краткий видеоролик.

person noussh    schedule 19.01.2011