• en
  • Language: ru
  • 3.7.x
  • Documentation version: 3.9

Как работает система меню

Основные понятия

Мягкие корни

Корень 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.