При оценке приглашения и Поддержка модулей для Drupal. Недавно мы поняли, что навигация по вкладкам по умолчанию не самая удобная для пользователя. В частности, у каждого модуля есть страница вкладок, на которых показаны различные категории приглашений или заявок в службу поддержки (ожидающие, отмененные и т. Д.). Для разработчиков проще всего заранее определить все вкладки, но с точки зрения пользователя имеет смысл предлагать только вкладки, содержащие контент.
Я предполагаю, что можно выполнять запросы, чтобы проверить, какие вкладки должны отображаться для конкретного пользователя, и изменить меню с помощью hook_menu_alter. Однако, это лучший способ сделать это или это вызовет проблемы с кешированием меню Drupal? Есть ли способ лучше?
Ответ 1 · рейтинг 1 · Berdir
Ответ jhedstrom правильный, но я не уверен, что динамическое отображение / скрытие локальных задач приводит к лучшему UX, что меня немного сбивает с толку.
Вместо этого я предлагаю использовать обратный вызов заголовка (который можно добавить с помощью того же hook_menu_alter () и показать количество вещей внутри этой конкретной вкладки. Это то, что я, например, использую для Privatemsg, чтобы показать количество непрочитанных сообщений.
См. Пример privatemsg_title_callback () и hook_menu для получения дополнительной информации. об обратных вызовах заголовков в целом.
Ответ 2 · рейтинг 1 · jhedstrom
Если вы хотите выборочно удалять вкладки динамическим способом (например, один узел получает вкладку, а другой - нет), вы не сможете использовать 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.
}