Как работает система меню¶
Основные понятия¶
Мягкие корни¶
Корень soft root - это страница, которая действует как корень для дерева навигации меню.
Как правило, это страница, которая является корнем нового значительного раздела на вашем сайте.
Когда функция мягкий корень включена, навигационное меню для любой страницы будет начинаться с ближайшего мягкого корня, а не с реального корня иерархии страниц сайта.
Эта функция полезна, когда ваш сайт имеет глубокую иерархию страниц (и, следовательно, несколько уровней в деревьях навигации). В этом случае вы обычно не хотите представлять посетителям сайта глубокие меню с вложенными элементами.
Например, вы находитесь на странице «Введение в кровотечение», поэтому меню может выглядеть следующим образом:
School of Medicine
Medical Education
Departments
Department of Lorem Ipsum
Department of Donec Imperdiet
Department of Cras Eros
Department of Mediaeval Surgery
Theory
Cures
Bleeding
* Introduction to Bleeding <current page>
Bleeding - the scientific evidence
Cleaning up the mess
Cupping
Leaches
Maggots
Techniques
Instruments
Department of Curabitur a Purus
Department of Sed Accumsan
Department of Etiam
Research
Administration
Contact us
Impressum
что откровенно ошеломляет.
Если сделать «Кафедру средневековой хирургии» мягким корнем, меню станет гораздо более управляемым:
Department of Mediaeval Surgery
Theory
Cures
Bleeding
* Introduction to Bleeding <current page>
Bleeding - the scientific evidence
Cleaning up the mess
Cupping
Leaches
Maggots
Techniques
Instruments
Регистрация¶
Система меню не является монолитной. Скорее, она состоит из множества активных частей, многие из которых могут работать независимо друг от друга.
Они работают со списком узлов меню, который передается по системе меню, пока не появится на другом конце.
Основными активными частями системы меню являются генераторы меню и модификаторы.
Некоторые из этих частей поставляются вместе с приложением «Меню». Некоторые приходят из других приложений (из приложения cms в django CMS, например, или из какого-то другого приложения).
Все эти активные части должны быть зарегистрированы в системе меню.
Затем, когда придет время создавать меню, система попросит все зарегистрированные генераторы и модификаторы меню приступить к работе над ним.
Генераторы и модификаторы¶
Генераторы и модификаторы меню являются классами.
Генераторы¶
Для добавления узлов в меню необходим генератор.
Например, в cms есть один, который исследует Страницы в базе данных и добавляет их как узлы.
Эти классы являются подклассами :py<menus.base.Menu
. В cms это cms.menu.CMSMenu
.
Чтобы использовать генератор, необходимо вызвать его метод get_nodes()
.
Модификаторы¶
Модификатор рассматривает собранные узлы и изменяет их в соответствии со своими требованиями (добавляет или удаляет их, или манипулирует их атрибутами, как считает нужным).
Важный в cms (cms.menu.SoftRootCutter
) удаляет узлы, которые больше не нужны, когда встречается мягкий корень.
Эти классы являются подклассами menus.base.Modifier
. Примерами являются cms.menu.NavExtender
и cms.menu.SoftRootCutter
.
Чтобы использовать модификатор, необходимо вызвать его метод modify()
.
Обратите внимание, что метод modify()
каждого модификатора может быть вызван дважды, до и после обрезки меню.
Например, при использовании тега шаблона {% show_menu %}
он называется:
сначала по
menus.menu_pool.MenuPool.get_nodes()
, с аргументомpost_cut = False
позже, тегом шаблона, с аргументом
post_cut = True
.
Это соответствует состоянию списка узлов до и после menus.templatetags.menu_tags.cut_levels()
, который удаляет узлы из меню в соответствии с аргументами, предоставленными тегом шаблона.
Это связано с тем, что некоторые модификации могут потребоваться на всех узлах, а некоторые - только на подмножестве узлов, оставшихся после вырезания.
Узлы¶
Узлы собираются в дерево. Каждый узел является экземпляром класса menus.base.NavigationNode
.
Узел NavigationNode имеет такие атрибуты, как URL, название, родитель и дети - как и следует ожидать в навигационном дереве.
Он также имеет атрибут attr
, словарь, который предоставляется для добавления произвольных атрибутов, вместо того, чтобы размещать их непосредственно на самом узле, где они могут с чем-то конфликтовать.
Предупреждение
Нельзя считать, что узел menus.base.NavigationNode
представляет собой страницу django CMS Page. Во-первых, некоторые узлы могут представлять объекты из других приложений. Во-вторых, вы не можете ожидать, что сможете получить доступ к объектам Page через NavigationNodes. Чтобы проверить, представляет ли узел CMS Page, проверьте наличие is_page
в :py<menus.base.NavigationNode.attr
и то, что он является True
.
Логика системы меню¶
Рассмотрим пример с использованием тега шаблона {% show_menu %}
. Для других тегов шаблонов он будет отличаться, и в ваших приложениях могут быть свои собственные классы меню. Но это должно помочь объяснить, что происходит и что делает система меню.
Нужно понимать, что система передает список nodes
, выполняя с ним различные действия.
Многие из приведенных ниже методов передают этот список узлов тем методам, которые они вызывают, и возвращают их тем методам, которые их в свою очередь вызвали.
Метод ShowMenu.get_context()
¶
Когда шаблонизатор Django встречает тег шаблона {% show_menu %}
, он вызывает get_context()
класса ShowMenu
. get_context()
:
вызывает
menus.menu_pool.MenuPool.get_nodes()
(см. Метод MenuPool.get_nodes() ниже)вырезает любые узлы, кроме своих потомков (если было указано
root_id
)вызывает
menus.templatetags.menu_tags.cut_levels()
для удаления нежелательных уровнейвызывает
menus.menu_pool.MenuPool.apply_modifiers()
сpost_cut = True
вернуть узлы в контекст в переменную
children
Метод MenuPool.get_nodes()
¶
menus.menu_pool.MenuPool.get_nodes()
поочередно вызывает три других метода MenuPool
:
menus.menu_pool.MenuPool.discover_menus()
- Проверяет
cms_menus.py
, и регистры каждого приложения: Классы меню, помещая их в дикту
self.menus
Классы модификаторов, помещая их в список self.modifiers
- Проверяет
menus.menu_pool.MenuPool._build_nodes()
проверяет кэш на предмет возврата кэшированных узлов
перебирает меню в self.menus (примечание: по умолчанию единственным генератором является
cms.menu.CMSMenu
); for each:вызывает свой
menus.base.Menu.get_nodes()
- генератор менюдобавляет все узлы в большой список
menus.menu_pool.MenuPool.apply_modifiers()
перебирает каждый узел, сравнивая его URL с request.path_info, и отмечает лучшее совпадение как
selected
.перебирает модификаторы (см. Модификаторы меню ниже) в
self.modifiers
, вызывая для каждого из нихmodify()
с помощьюpost_cut=False
.
Модификаторы меню¶
Каждый Modifier
манипулирует узлами меню и их атрибутами.
Модификаторы по умолчанию, в порядке их вызова, следующие:
-
Если
post_cut
равноTrue
, удаляет все узлы ниже соответствующего мягкого корня; в противном случае возвращается немедленно. -
Если
post_cut
илиbreadcrumb
равноTrue
, возвращается немедленно; в противном случае, перебирает все узлы; находит выбранный, отмечает его предков, братьев и сестер и детей menus.modifiers.AuthVisibility
Удаляет узлы, для просмотра которых требуется авторизация
-
Перебирает все узлы; для каждого узла, который является корневым узлом (
level == 0
), передает его в:mark_levels()
перебирает потомков узла, отмечая их уровни
Django CMS 3.9
Содержание
- Учебники
- Руководства по эксплуатации
- Справочник
- Основные темы
- Вклад
- Примечания к выпуску и информация об обновлении
- Использование django CMS
Дополнительно
Вы здесь:
-
Документация Django Django CMS 3.9
- Основные темы
- Как работает система меню
- Основные темы