Сниппет вывода меню

Сниппет "Вывод меню"

Хотите вывести меню - можно сделать это с помощью простого фрагмента кода.

Игорь написал Пропало верхнее меню, в админке оно есть и к нему привязаны страницы. В старой версии 1.х дамп параметров модуля меню из папки common_parts имел поле sections. В версии 2.x движка модуль не видит это поле. Как вывести меню после обновления?

Учитывая негативные отзывы верстальщиков о расположении визуализационных модулей в папке common_parts, где они недоступны из админпанели хотя бы для просмотра их кода, то новыми версиями движка предложен набор системных шаблонизационных функций, из которых возможно составить свой код на порядок проще.

В качестве примера подобного кода покажем сниппет вывода меню. Используйте его вместо вызова старого модуля, только вёрстку замените своей (мы специально демонстрируем пример на основе тегов «ul» «li» без теговых атрибутов).

Простой случай Допустим хотим извлечь меню с названием Верхнее меню в некую переменную $myMenu и вывести все специальные страницы (это поле sections), прикреплённые к нашему меню.

{menuByLangTechName name='Верхнее меню' assign=myMenu}
«ul»
    {foreach $myMenusections as $item}
        «li»«a href="{url}"»{name}«/a»«/li»
    {/foreach}
«/ul»

Здесь мы воспользовались следующими шаблонизационными функциями:

  • menuByLangTechName - извлечь меню по названию, коду языка или техническому имени
  • url - вывести адрес страницы
  • name - вывести название

Функции url и name по умолчанию оперируют переменной с именем $item, поэтому такое название переменной мы использовали в цикле. Это позволяет упростить код. В ином случае именования переменной цикла следует явно указывать употреблённое имя в параметрах функций url и name. Например:

{foreach $myMenu-»sections as $myVar}
    «li»«a href="{url from=myVar}"»{name from=myVar}«/a»«/li»
{/foreach}

или

{foreach $myMenu-»sections as $myVar}
    «li»«a href="{url item=$myVar}"»{name item=$myVar}«/a»«/li»
{/foreach}

Улучшенный случай Отличается от предыдущего примера тем, что проверяем ситуацию, когда в результате действий менеджера меню может оказаться пустым (например временно выключил показ каких-либо страниц или скрыл от неавторизованных посетителей) или вообще нет такого меню. То есть предотвращаем попадание на страницу пустого тега «ul».

{menuByLangTechName name='Верхнее меню' assign=myMenu}
{if !empty($myMenu-»sections)}
    «ul»
        {foreach $myMenu-»sections as $item}
            «li»«a href="{url}"»{name}«/a»«/li»
        {/foreach}
    «/ul»
{/if}

Идеальный случай Отличается от предыдущих пометкой активного пункта меню. Прежде чем выводить пункты, сначала получаем в переменную $selectedId идентификатор активной страницы и во время вывода на основе сравнения с идентификатором текущего элемента формируем класс, например active, у того тега «li», который относится к активной записи.

{menuByLangTechName name='Верхнее меню' assign=myMenu}
{if !empty($myMenu-»sections)}
    {echoVar from='section-»section_id' assign=selectedId}

    «ul»
        {foreach $myMenu-»sections as $item}
            {echoVar from='item-»section_id' assign=currentId}
            {$class = ($currentId == $selectedId) ? 'class="active"' : ''}

            «li {$class}»«a href="{url}"»{name}«/a»«/li»
        {/foreach}
    «/ul»
{/if}

Здесь использовали ещё одну шаблонизационную функцию:

  • echoVar - вывести значение переменной

Вывод других страниц

Обычно меню используют, чтобы вывести набор некоторых специальных страниц. Однако в админпанели менеджер может прикрепить в меню и другие типы страниц. Напомним их список и названия полей, которые доступны тогда в переменной извлечённого меню:

  • categories - прикреплённые категории
  • brands - прикреплённые бренды
  • products - прикреплённые товары
  • sections - прикреплённые специальные страницы
  • files - прикреплённые медиа файлы
  • articles - прикреплённые статьи
  • news - прикреплённые новости

Простой случай вывода новостей Тут мы предполагаем, что менеджер прикрепил в меню какой-то набор новостей. Соответственно в цикле перебираем элементы поля news.

{menuByLangTechName name='Верхнее меню' assign=myMenu}
«ul»
    {foreach $myMenu-»news as $item}
        «li»«a href="{url}"»{name}«/a»«/li»
    {/foreach}
«/ul»

Кстати, при переборе прикреплённых категорий (это поле categories) стоит помнить, что они могут иметь вложенные подкатегории. Следовательно мы могли бы пойти вглубь вложения, использовав для такой цели локальную функцию, например под именем showSubcategories, и получить многоуровневое меню.

{function showSubcategories}
    {if !empty($cat-»subcategories)}
        «ul»
            {foreach $cat-»subcategories as $item}
                «li»
                    «a href="{url}"»{name}«/a»
                    {showSubcategories cat=$item}
                «/li»
            {/foreach}
        «/ul»
    {/if}
{/function}

{menuByLangTechName name='Верхнее меню' assign=myMenu} «ul» {foreach $myMenu-»categories as $item} «li» «a href="{url}"»{name}«/a» {showSubcategories cat=$item} «/li» {/foreach} «/ul»

Обсуждение

Игорь
Спасибо за оперативность!
madness Digital Network RU-DINet Москва
Мне тоже нравятся эти ребята :)

С оперативностью тут иногда можно поспорить. Но объяснения это всегда у них на высоте. Подробно, в деталях до мелочей. Молодцы! И оформление постов прикольно делают, хотя и разноцветно слегонца.
slon K-Telecom Чусовой Россия
Размер этого движка имеет прямое влияние на оперативность. Я не понимаю, зачем его кодовую часть стремятся сделать понятной пользователям. Движок должен быть понятен технику, пользователю - пользовательское.
Vlad Polkomtel-PlusNet Гданьск Польша
Потому что пользователь хочет рюшечки. А платить не за все готов. Тогда пусть делает сам. Для этого ему пишут понятно.
Вячеслав
"из которых возможно составить свой код на порядок проще"

Ага, если впридачу к функциям есть документация. А иначе код не составить, о "проще" не говорю уже.
Jurazzzik
Коменты в шаблоне имперы почти мануал.

Написать комментарийОтветить на выделенный комментарий

Начнём?

Если у вас есть соображение по поводу изложенного выше материала или следуемого за ним обсуждения, вы можете высказать свою мысль прямо сейчас. Понадобится пройти всего 2 шага: написать комментарий, указать своё имя.

Допустимые теги

При написании комментария вы можете использовать некоторые из так называемых BB-кодов. Они обозначают подстановку определённого элемента на их место.

  • опционально парные:
    • [shot=image-url] ALT text [/shot]
    • [link=page-url] anchor text [/link]
  • всегда парные:
    • [quote] comment fragment [/quote]
    • [code] source code fragment [/code]
  • одинарные:
    • [youtube=video-url]
  • и "теговые" символы:
    • « и »

Обратите внимание

С целью точнее идентифицировать вас перед другими участниками обсуждения, сайт может высвечивать возле вашего имени две первые цифры вашего IP-адреса, название провайдера и город, опознанные по базе географической привязки IP-адресов.