Как показать неактивные вкладки задач в Drupal
Есть ли способ показать локальные задачи пользователю, если у них нет необходимых разрешений? Сейчас кажется, что Drupal просто исключает их из кода страницы. Я хочу показать их, но с другим классом CSS.
Версия Drupal 5.20
2 ответа
Даже при том, что между Drupal 5 и 6 есть некоторые различия в локальном построении задач, Mac прав, что логика игнорирования записей, недоступных текущему пользователю, довольно глубоко встроена в функции menu.inc. Если вы хотите посмотреть на себя, начните с theme_menu_local_tasks()
и следуйте вызовам функций оттуда.
Если бы мне пришлось реализовать функцию, которую вы ищете, я бы предпочел не предлагать Mac'ам возиться с настройками доступа к меню напрямую. Вместо этого я бы переопределил theme_menu_local_tasks()
с пользовательской версией и продублируйте логику поиска записи там. При первом запуске будут получены первичные и вторичные ссылки, как и раньше, а во втором будет сделано то же самое, когда он будет выдавать себя за другого пользователя (в данном случае, вероятно, пользователя 1). Таким образом, я получил бы две версии локальной разметки задач, которые мне тогда нужно было как-то изменить, чтобы найти те, которые не разрешены для текущего пользователя, и, таким образом, нуждался в дополнительном классе CSS.
Обратите внимание, что это все равно было бы несколько уродливо, так как menu_primary_local_tasks()
а также menu_secondary_local_tasks()
вернуть уже тематические списки, поэтому сравнение должно работать с разметкой, вероятно, как-то анализируя теги li. Поэтому, возможно, стоит потратить некоторое время, пытаясь сделать то же самое (извлекая локальные задачи двумя разными пользователями), но используя функции более низкого уровня, чтобы получить записи перед тематикой.
Примечание. Если в конечном итоге вы используете логику олицетворения пользователя, обязательно используйте безопасную вторую версию, которая отключает сохранение сеанса во время олицетворения.
Я знаю версию hook_menu для D6 гораздо лучше, чем D5. AFAIK - однако - вы не можете переопределить это поведение, так как оно жестко задано в menu.inc.
Если я прав в том, что выше, обходной путь (довольно нелегкий, я должен признать) мог бы быть:
- Уберите контроль доступа из пункта меню, чтобы все пункты меню были видны всем пользователям.
- Включите контроль доступа в обратный вызов напрямую (вы сразу сделаете вкладку недоступной для клика, но если пользователь вставит URL-адрес напрямую, это предотвратит доступ к страницам, которые он не должен видеть).
- На странице, отображающей вкладки, загрузите другой файл js в зависимости от роли пользователя. JS-файл для пользователей с ограниченным доступом будет выбирать вкладки по текстовому содержимому (по крайней мере, на вкладках D6 не будет никакого "отдельного" класса: они получают только одну "вкладку"), он удалит ссылку на вкладки пользователь не имеет разрешения на посещение, и он добавит пользовательский класс для тех вкладок, которые должны отображаться по-разному.
- Добавьте CSS темы для вашего пользовательского класса.
Как уже говорилось ранее, я не очень хорошо знаю D5, поэтому может также оказаться, что на самом деле вы можете достичь того, чего хотите, гораздо чище!