Как показать только заполненные вкладки меню в Drupal? - PullRequest
0 голосов
/ 10 февраля 2011

При оценке модулей Пригласить и Поддержка для Drupal недавно мы поняли, что навигация по вкладкам по умолчанию не самая удобная для пользователя. В частности, у каждого модуля есть страница вкладок, на которой отображаются различные категории приглашений или заявок в службу поддержки (ожидающие, отмененные и т. Д.). Для разработчиков проще всего заранее определить все вкладки, но с точки зрения пользователя имеет смысл предлагать только вкладки, содержащие контент.

Я предполагаю, что можно запускать запросы, чтобы проверить, какие вкладки должны отображаться для конкретного пользователя, и изменить меню, используя hook_menu_alter . Тем не менее, это лучший способ сделать это или это вызовет проблемы с кэшированием меню в Drupal? Есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Ответ от jhedstrom правильный, но я не уверен, что динамическое отображение / скрытие локальных задач приводит к лучшему UX, что звучит немного странно для меня.

Вместо этого я бы предложил использоватьобратный вызов заголовка (который может быть добавлен с помощью того же hook_menu_alter () и показывает количество вещей внутри этой конкретной вкладки. Именно это я, например, использую для Privatemsg, чтобы показать количество непрочитанных сообщений.

См. privatemsg_title_callback () для примера и hook_menu для получения дополнительной информации о обратных вызовах заголовка в целом.

1 голос
/ 10 февраля 2011

Если вы хотите выборочно удалять вкладки динамическим способом (например, один узел получает вкладку, а другой нет), вы не сможете использовать hook_menu_alter (), потому что это действует только тогда, когда кэш менюстроится.Однако вы можете сделать это, переопределив обратный вызов доступа к меню.Если доступ к вкладке запрещен, она не будет отображаться.

Например, чтобы переопределить вкладку узла, вы можете сделать что-то вроде этого:

function mymodule_menu_alter(&$items) {
  $item['node/%node/foo']['access callback'] = 'mymodule_override_access';
}

function mymodule_override_access($node) {
  // Perform queries, logic, etc to determine if content exists at node/nid/foo.
  // Return false if there is no content, otherwise fall through to the original
  // access callback function.
}
...