Как в Drupal показывать только заполненные вкладки меню?

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

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


person Matt V.    schedule 10.02.2011    source источник


Ответы (2)


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

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

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

person Berdir    schedule 10.02.2011
comment
Спасибо, мне нравится эта идея! Забавно, мы тоже добавляем Privatemsg, но я еще не заметил этой функции. - person Matt V.; 10.02.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.
}
person jhedstrom    schedule 10.02.2011