В прошлых уроках мы уже создавали MODX меню: 1й — и 2й — Вывод стандартного выпадающего MODX меню с использованием Bootstrap. Сегодня мы научимся выводить многоуровневые Bootstrap меню с неограниченно степенью вложенности (3х уровневое меню, 4х, 5ти и т.д.).
Для примера я выведу 5-ти уровневое Bootstrap меню, вы же его сможете сделать и 3х уровневым и 7ми уровневым, хоть 10, поменяв значение level на нужное вам!
Вывод многоуровневого меню будет таким:
[]>[[+wrapper]]` &tplInner=`@INLINE
` &tplParentRow=`@INLINEИз коробки оно работать не будет. так как Bootstrap 3 по умолчанию поддерживает только 2 уровня вложенности, и для того что бы расширить уровень вложенности bootstrap 3 меню, необходимо подключить js файл со следующим содержанием.
(function($){ $(document).ready(function(){ $("ul.dropdown-menu ").on("click", function(event) { event.preventDefault(); event.stopPropagation(); $(this).parent().siblings().removeClass("open"); $(this).parent().toggleClass("open"); }); }); })(jQuery);
После того начнется открываться 3й, 4й и т.д. уровни вложенности. В принципе все, но есть одно но, данное меню будет открываться вниз все уровни, а это по-моему не особо правильно и красиво, но это поправимо при помощи CSS.
В моем случае получилось 2 строки CSS кода, чтобы уровни выпадали в бок.
Ul.dropdown-menu {left: 100%;top: -8px;} li.submenu1.dropdown.open>ul.dropdown-menu {left: 0%; top: 100%;}
У вас может получить немного другой (но идентичный этому) код и количество его строчек может быть больше в случае если у вас несколько веток меню с подменю. Ну и еще по мелочи придется поправить css под свой вкус, моя цель показать основу. Как найти нужные css классы в коде, к которым нужно применить стили показано в видео, ну а если быть точнее то там показан весь процесс создания многоуровневого меню.
В моем видео вышло вот такое меню
Если вам нужно повернуть треугольнички в выпадающем меню (они направлены в низ, когда выпадают элементы влево), что бы получилось вот так.
Тогда добавьте следующий css код:
Li.submenu2.dropdown>a>span.caret { -moz-transform: rotate(-95deg); -ms-transform: rotate(-95deg); -webkit-transform: rotate(-95deg); -o-transform: rotate(-95deg); transform: rotate(-95deg); } li.submenu3.dropdown>a>span.caret { -moz-transform: rotate(-95deg); -ms-transform: rotate(-95deg); -webkit-transform: rotate(-95deg); -o-transform: rotate(-95deg); transform: rotate(-95deg); } li.submenu4.dropdown>a>span.caret { -moz-transform: rotate(-95deg); -ms-transform: rotate(-95deg); -webkit-transform: rotate(-95deg); -o-transform: rotate(-95deg); transform: rotate(-95deg); }
Дата публикации: 07.02.2011
В этом несложном уроке я покажу, как настраивается меню.
Однажды меня попросили исправить баг с меню на одном сайте - некоторые пункты упорно не хотели выстраиваться в ряд, а вместо этого вылезали в неожиданных местах страницы при наведении курсора. Баг заключался не в кривом css, как я предположила сначала, а в криво настроенном вызове Wayfinder.
Что такое Wayfinder - это сниппет, который используется, когда нужно вывести список документов раздела/ов. В результате работы сниппета генерируется ненумерованный список. При помощи различных параметров с этим списком можно сделать все, что угодно:) Подробнее вы можете почитать в документации , или набрав в Google - “wayfinder modx wiki”.
Важные примечания:
1. О том, что такое MODx, как установить MODx, как организовать структуру документов, как из html сделать шаблон, что такое чанк и проч. вопросы новичков в этом уроке я не рассматриваю.
2. Плейсхолдеры, которые я буду использовать в уроке, указаны в том формате, который «понимает» Evo версия. В чем разница, смотрите пример:
Итак, разберем создание меню по шагам.
Для урока набросала вот такое меню:
Здесь для наглядности я применила разные стили к разным уровням меню. На том сайте, где фиксила баг с меню, было примерно так же - у каждого уровня меню свой стиль.
Верстаем - подробности верстки в рамки данного урока не входят, вот такой код у меня получился:
Полюбовавшись кодом, определяем для себя, какой класс в нашем меню за что отвечает (это если ковыряетесь в чужом коде, в своем и так должно быть ясно ):
ul class="menu" - класс всего меню
li class="top" - класс пунктов меню верхнего уровня
a class="top_link" - класс для ссылок в пунктах верхнего уровня
ul class="sub" - класс для подменю
ну и span class="down" для оформления пунктов верхнего уровня
Продукция
- Доставка
- Поставщики
У документа «Продукция» создаем дочерние документы: «Сыворотка правды», «Средство Макропулоса», «Универсальные средства».
В шаблоне, в том месте где у вас должно быть меню, убираем весь лишний код (сам html код меню), вместо него пишем
{{ menu}}Тем самым мы выносим меню в отдельный чанк. Потом создаем новый чанк и называем его menu . Пока в содержимое чанка можно скопировать код меню, который вы сверстали. Для наглядности.
Зайдите в админке в «Сайт»-> “Просмотр” - чтобы проверить, что все нормально с путями к файлу стилей и картинкам.
Получилось? Ок, но это еще не меню. Вдохнём в него жизнь при помощи Wayfinder.
Удалите все содержимое чанка menu и вместо этого вызовите сниппет Wayfinder.
Пока напишем так:
параметр startId - указывает, с какого документа начинать формировать список. У нас указан 0 - это значит, что список формируется с корня дерева документов.
Посмотрим, что получилось:
Это - рабочее и живое меню. Переименовывайте документы, удаляйте, добавляйте - меню будет формироваться в соответствии с деревом документов.
Wayfinder по умолчанию формирует простой код () , все классы списков и элементов задаются специальными параметрами при вызове.
В начале урока мы определяли, какие css-классы в нашем меню за что отвечают. У Wayfinder имеются нужные нам параметры: outerClass - класс для контейнера меню. Сопоставив с нашей вёрсткой, получаем такой вызов Wayfinder:
[[ Wayfinder? &startId=`0` &level=`2` &outerClass=`menu`]]помимо параметров с классами указываем уровень вложенности - &level=`2` .
Отмечаем недостатки - нет классов для пунктов меню верхнего уровня, нет тегов и класса для подменю.
Все эти недостатки исправляются добавлением соответствующих параметров к вызову Wayfinder.
Для этого есть переменная rowTpl , которая описывает шаблон для пункта меню, делаем такой шаблон, для этого создаем чанк под названием parent:
В вызове Wayfinder добавляем &rowTpl=`parent`
.
Не забываем проверять исходный код - уже почти все хорошо, осталось подменю.
Для настройки подменю используем переменную innerRowTpl .
Создаем чанк inner :
Добавляем в вызов Wayfinder переменную innerRowTpl=`inner` и переменную, которая указывает класс для контейнера подменю &innerClass=`sub` .
Окончательный вызов Wayfinder выглядит так:
[ ]Всё, наше меню готово. Успехов!
&rowTpl=`rowTpl`
&outerTpl=`outerTpl`
&hereClass=`active`
&rowClass=`eNav_li`]]
Параметры снипета:
&startId - id родительской страницы, если указать 0 будет от корня сайта. По умолчанию стоит значение id активной страницы
&displayStart - показывать документ со startId в заголовке меню, по умолчанию false
&level - глубина вложенности, по умолчанию 0 - все уровни
&limit - ограничение количества страниц в выводе (по умолчанию 0 - без ограничений)
&ignoreHidden - игнорировать чек бокс страницы "Показывать в меню", т.е. если указать 1, выведет все страницы. По умолчанию 0. Выводятся только те страницы, у которых отмечен чек бокс "Показывать в меню"
&ph - имя подстановщика, заменяющего непосредственно выводимые результаты. По умолчанию 0.
&debug - режим отладки (по умолчанию 0)
&hideSubMenus - раскрывать только активное подменю (по умолчанию 0)
&removeNewLines - убирает символ переноса строки при выводе (по умолчанию 0)
&textOfLinks - для названия ссылки меню. Возможные варианты: menutitle, id, pagetitle, description, parent, alias, longtitle, introtext . По умолчанию menutitle
&titleOfLinks - для title ссылки меню.Варианты: menutitle, id, pagetitle, description, parent, alias, longtitle, introtext. По умолчанию pagetitle
&rowIdPrefix - устанавливает id (rowIdPrefix + docId)для каждого элемента. По умолчанию 0
&includeDocs - id документов через запятую, которые будут включены в меню (по умолчанию не указывается)
&excludeDocs - id документов через запятую, которые будут исключены из меню (по умолчанию 0)
&contexts - контекст для генерации меню. По умолчанию текущий.
&startIdContext - Индентификатор контекста из которого берутся документы для формирования результата.
&config - Внешний PHP файл, для хранения конфигурации Wayfinder (пример: core/components/wayfinder/configs).
&scheme - Формат для генерации URL. Возможные значения (основанны на вызове makeURL API):
1: (значение по умолчанию) URL по отношению к site_url;
0: смотрите http;
1: смотрите https;
full: абсолютный URL начинающийся с site_url;
abs: абсолютный URL начинающийся с base_url;
http: абсолютный URL, заданный принуждённо в http-схеме;
https: абсолютный URL, заданный принуждённо в https-схеме.
&sortBy - Поле, по которому происходит сортировка. (по умолчанию menuindex)
Варианты:
id, menutitle, pagetitle, introtext, menuindex, published, hidemenu, parent, isfolder, description, alias, longtitle, type, templateПример шаблона:
Эти параметры указывают чанки, которые содержат шаблоны, которые будут генерировать вывод Wayfinder.
В текущей версии Wayfinder для MODX Revolution, вы можете получить доступ к вашим кастомным TV используя плейсхолдеры префикса wf. , например [[+my_TV]]
На момент написания статьи, будут возвращены только исходные значения TV - они не будут форматироваться. Например, если вашим TV является изображение - обычное использование такое TV внутри вашего шаблона будет возвращать полный полный тег изображения, но внутри шаблона Wayfinder - будет возвращён только путь к изображению.
Если вы хотите обрабатывать TV, вы можете сделать это вызовом сниппета в пределах шаблона ряда Wayfinder (&rowTpl . Например ваш TV изображения называется icon и обычно для вывода в шаблоне используется примерно такой код:
... ...
Но так как это не позволит вам обрабатывать TV, нужно заменить его на:
... ...
И теперь внутри сниппета processTV помещаем следующий PHP код:
getObject("modResource", $myId); return $doc->getTVValue($myTV);
В результате возвращается полностью обработаное TV изображения.
Название чанка содержащий шаблон внешнего контейнера.
Доступные плейсхолдеры:
Параметр &innerTpl содержит такой же набор плейсхолдеров что и &outerTpl .
Название чанка содержащий шаблон для элементов ряда меню.
Доступные плейсхолдеры:
Пример использования:
Ещё один вариант:
Первого уровня
Код чанка outerTpl
Код чанка rowTpl
Второго уровня (в этом примере меню и пункты подменю были визуально на одном уровне
[[!Wayfinder? &startId=`0` &level=`2`
&rowTpl=`rowTplFooterMenu`
&outerTpl=`outerTplFooterMenu`
&innerTpl=`innerTplFooterMenu`
&innerRowTpl=`innerRowTplFooterMenu`
&hereClass=`active`]]
Код чанка outerTplFooterMenu
код чанка rowTplFooterMenu
код чанка innerTplFooterMenu
[[+wf.wrapper]]
код чанка innerRowTplFooterMenu
Приветствую вас уважаемые читатели. В прошлом уроке мы наполнили немного сайт контентом (), теперь пора это все вывести в меню , чтобы пользователи могли переходить на них.
Создавать динамическое меню в MODX мы будем при помощи сниппета PdoMenu из пакета pdoTools . Перед тем как начать ознакомьтесь с основной документацией.
официальную документацию можете почитать здесь
. А сейчас разберем самые типовые вызовы меню.
Вариант 1 . На месте этого статического меню вызовем сниппет pdoMenu , для этого в дереве ресурсов, на вкладке “Элементы ” в разделе сниппеты разверните ветку pdoTools , далее нажмите на pdoMenu левой кнопкой мыши (не отпускайте кнопку) и перетащите этот сниппет в место, где вы хотите вызвать меню, далее в открывшемся окошке заполните необходимые параметры и нажмите «Сохранить «.
Вариант 2 . Просто вручную пишем вызов.
К примеру у нас самое обычное меню, со следующей html разметкой.
Получился вот такой код с вызовом меню:
Статический html код выглядит так:
Код его вывода будет таким:
Так же в следующем уроке я приведу еще пару выводов выпадающих меню, на основе bootstrap ( и , это для тех кто не уловил суть. Ну а далее сделаем .
На первый взгляд выглядит все сложно, но то не так, читайте подробнее документацию, задавайте вопросы в комментариях обязательно помогу.
Для создания динамического меню мы воспользуемся готовым сниппетом Wayfinder . Сниппет, как вы, надеюсь, помните из предыдущих уроков, это кусок Php кода, который мы можем включать в наш шаблон. Отличие от чанков только в коде и методе вызова. Если чанк мы вызываем с помощью двойных фигурных скобок, то сниппеты вызываются с помощью таких [!Имя_сниппета!] - некэшируемый вызов, или таких [[Имя_сниппета]] - кэшируемый вызов. Код каждого сниппета должен начинаться с а заканчиваться ?> . Помимо этого, каждому сниппету можно передавать специальные значения параметров, которые он будет обрабатывать. В MODx уже есть несколько готовых сниппетов, которые мы будем в дальнейшем использовать.
Сниппет Wayfinder служит для организации списков ссылок для MODx. Меню нашего сайта и есть список таких ссылок. Давайте для начала найдем кусок кода, отвечающего за вывод нашего меню. Меню находится в чанке HEADER , вот оно:
Давайте вырежем этот код, вместо него напишем:
{{MENU}}
А код вставим в новый чанк MENU , в описании чанка напишем Меню сайта . Теперь давайте изучим этот код.
Меню нашего сайта представляет собой простой, ненумерованный список, находящийся в контейнере с id="templatemo_menu" . Давайте вырежем этот список из контейнера и вместо него вставим вызов нашего сниппета:
&startId=`0` - это параметр со значением 0, который указывает сниппету ID папки, в которой лежат обрабатываемые документы. Все наши документы, которые мы будем отображать в меню, лежат в корневой папке, ID корневой папки равен нулю. Давайте посмотрим, что у нас получилось.
Наше меню заработало, только активный пукнт перестал выделяться белым цветом:
Чтобы понять, почему это произошло, нам надо посмотреть исходный код страницы. В Mozilla Firefox это делается таким образом: Вид >> Исходный код страницы или просто нажав сочетание клавиш Ctrl+U . Находим код нашего меню:
Обращаем внимание на то, что в исходном коде у активного пункта был class="current"
, а наш сниппет автоматически присваивает активному пункту class="active"
. Замечаем еще тот момент, что в исходном коде класс применялся к тегу
, а теперь к тегу
Находим в папке C:/xampp/htdocs/site/www/assets/templates/ файл templatemo_style.css и открываем его с помощью Notepad++. Ищем в этом файле описание класса current, оно находится в 198 строке:
#templatemo_menu li .current{
padding-left: 40px;
color: #ffffff;
}
заменяем класс current на active , не забывая переназначить его тегу :
#templatemo_menu li.active a {
padding-left: 40px;
color: #ffffff;
}
Сохраняем файл. Смотрим, что получилось.
Наше меню заработало точно так, как это задумывали дизайнеры. Теперь мы можем переходить по страницам нашего сайта с помощью нашего главного меню. При добавлении в корневую папку других документов, они автоматически будут отображаться в нашем меню. Чтобы нежелательные документы не отображались в меню, у них следует убрать галочку с Показывать в меню
. Можно принудительно исключить нежелательный пункт с помощью параметра &excludeDocs=`список id исключаемых документов, через запятую`
.
Чтобы в меню не отображались дочерние документы, которые мы будем создавать на следующих уроках, давайте добавим в вызов сниппета параметр level , который определяет количество уровней в меню, по умолчанию будут отображаться все уровни, ограничим только одним уровнем: