Контекстно-зависимое меню и treemenus

2915 0

В процессе создания сайта wanters.ru и этого сайта понадобилось привязать меню к содержимому страниц сайта. Для создания меню я использовал приложение treemenus, автор которого любезно описал его возможности и способы расширения.

Собственно процесс создания меню описывать я не буду, поскольку он довольно тривиален и подробно описан у автора в документации.

А вот особенности menu_extension и его настройки, связанные с контексто-ориентированностью и разграничением доступа постараюсь описать на примере своего сайта.

Итак, начнем.

1. Выполняем инструкции автора treemenus по установке приложения-расширения menu_extension, не делая пока syncdb (если не хотите потом править базу вручную или удалять таблицы для повторного создания).

2. Начинаем "обрабатывать напильником" под себя. Для этого вносим в код поправки.

models.py

...
usr = models.BooleanField(default=False)
# признак зарегистрированного пользователя
wrk = models.BooleanField(default=False)
# признак пользователя с доступом к рабочей информации
frnd = models.BooleanField(default=False)
# признак пользователя с привелегированным доступом
 selected_patterns = models.TextField(blank=True)
# признак выбора текущего меню

menu_item.html

{% ifequal menu_type "Top_hor" %}
{% load menu_extension_filters %}
{% if user.is_authenticated %} {# Если авторизовался, то кто ты? #}
{% if perms.admin %} {# Если админ, то показываем все #}
<li>
<a href="{{ menu_item.url }}" class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{# Меняем css класс меню для текущего контекста #}
{{ menu_item.caption }}
</a>
</li>
{% else %} {# Если не адми, то кто ты? #}
 {% if perms.cont.frnd_view and menu_item.extension.frend %} {# Если привелегированый #}
<li>
<a href="{{ menu_item.url }}"
class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{{ menu_item.caption }}
</a>
</li>
{% else %} {# Если не привелегированный, то кто ты? #}
{% if perms.cont.wrk_view and menu_item.extension.work %} {# Если по работе #}
<li>
<a href="{{ menu_item.url }}"
class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{{ menu_item.caption }}
</a>
</li>
 {% else %} {# Если не по работе, то ты зарегистрированный юзер #}
{% if menu_item.extension.public %}
<li>
<a href="{{ menu_item.url }}" class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{{ menu_item.caption }}
</a>
</li>
{% endif %}
{% endif %}
{% endif %}
{% endif %}
 {% else %} {# Если не авторизовался #}
{% if menu_item.extension.public %}
<li>
<a href="{{ menu_item.url }}" class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{{ menu_item.caption }}
</a>
</li>
{% endif %}
{% endif %}
{% endifequal %} 

Не забываем добавить в свой views.py или в models.pu (в зависимости от навыков :)) разграничение доступа к контенту.

3. И, наконец, последняя тонкость. При создании меню через админку, если вы хотите, чтобы головное меню воспринимало подчиненные меню как свою часть и отображало их, то Selected patterns необходимо оформлять примерно так:

^/$ # Главная страница сайта
^/world/
^/short/
^/funny/
^/tehno/ 

Примерно так выглядит Selected patterns для меню "Главная" на этом сайте.

Описаный мной способ подходит для двухуровневого меню. Что-то более сложное, на мой взгляд с помощью treemenus реализовывать не стоит. Легче написать своё.

Комментарии

Контактные данные

 Россия, г. Москва