Корень soft root - это страница, которая действует как корень для дерева навигации меню.
Как правило, это страница, которая является корнем нового значительного раздела на вашем сайте.
Когда функция мягкий корень включена, навигационное меню для любой страницы будет начинаться с ближайшего мягкого корня, а не с реального корня иерархии страниц сайта.
Эта функция полезна, когда ваш сайт имеет глубокую иерархию страниц (и, следовательно, несколько уровней в деревьях навигации). В этом случае вы обычно не хотите представлять посетителям сайта глубокие меню с вложенными элементами.
Например, вы находитесь на странице «Введение в кровотечение», поэтому меню может выглядеть следующим образом:
Система меню не является монолитной. Скорее, она состоит из множества активных частей, многие из которых могут работать независимо друг от друга.
Они работают со списком узлов меню, который передается по системе меню, пока не появится на другом конце.
Основными активными частями системы меню являются генераторы меню и модификаторы.
Некоторые из этих частей поставляются вместе с приложением «Меню». Некоторые приходят из других приложений (из приложения cms в django CMS, например, или из какого-то другого приложения).
Все эти активные части должны быть зарегистрированы в системе меню.
Затем, когда придет время создавать меню, система попросит все зарегистрированные генераторы и модификаторы меню приступить к работе над ним.
Модификатор рассматривает собранные узлы и изменяет их в соответствии со своими требованиями (добавляет или удаляет их, или манипулирует их атрибутами, как считает нужным).
Важный в cms (cms.menu.SoftRootCutter) удаляет узлы, которые больше не нужны, когда встречается мягкий корень.
Это соответствует состоянию списка узлов до и после menus.templatetags.menu_tags.cut_levels(), который удаляет узлы из меню в соответствии с аргументами, предоставленными тегом шаблона.
Это связано с тем, что некоторые модификации могут потребоваться на всех узлах, а некоторые - только на подмножестве узлов, оставшихся после вырезания.
Узел NavigationNode имеет такие атрибуты, как URL, название, родитель и дети - как и следует ожидать в навигационном дереве.
Он также имеет атрибут attr, словарь, который предоставляется для добавления произвольных атрибутов, вместо того, чтобы размещать их непосредственно на самом узле, где они могут с чем-то конфликтовать.
Предупреждение
Нельзя считать, что узел menus.base.NavigationNode представляет собой страницу django CMS Page. Во-первых, некоторые узлы могут представлять объекты из других приложений. Во-вторых, вы не можете ожидать, что сможете получить доступ к объектам Page через NavigationNodes. Чтобы проверить, представляет ли узел CMS Page, проверьте наличие is_page в :py<menus.base.NavigationNode.attr и то, что он является True.
Рассмотрим пример с использованием тега шаблона {%show_menu%}. Для других тегов шаблонов он будет отличаться, и в ваших приложениях могут быть свои собственные классы меню. Но это должно помочь объяснить, что происходит и что делает система меню.
Нужно понимать, что система передает список nodes, выполняя с ним различные действия.
Многие из приведенных ниже методов передают этот список узлов тем методам, которые они вызывают, и возвращают их тем методам, которые их в свою очередь вызвали.
Если post_cut или breadcrumb равно True, возвращается немедленно; в противном случае, перебирает все узлы; находит выбранный, отмечает его предков, братьев и сестер и детей