Всё для сайтов

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

Полезные сведения

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

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

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

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

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

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

{menuByLangTechName name='Верхнее меню' assign=myMenu}
<ul>
    {foreach $myMenu->sections 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>
Обсуждение
«Игорь | 3 апр 00:09
Спасибо за оперативность!
Ответить
«madness | 3 апр 00:37
Мне тоже нравятся эти ребята :)

С оперативностью тут иногда можно поспорить. Но объяснения это всегда у них на высоте. Подробно, в деталях до мелочей. Молодцы! И оформление постов прикольно делают, хотя и разноцветно слегонца.
Ответить
«slon | 7 апр 17:48
Размер этого движка имеет прямое влияние на оперативность. Я не понимаю, зачем его кодовую часть стремятся сделать понятной пользователям. Движок должен быть понятен технику, пользователю - пользовательское.
Ответить
«Vlad | 8 окт 12:15
Потому что пользователь хочет рюшечки. А платить не за все готов. Тогда пусть делает сам. Для этого ему пишут понятно.
Ответить
«Вячеслав | 14 июл 00:05
"из которых возможно составить свой код на порядок проще"

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

Другие обсуждения »

Теги: сниппет, вывести меню

Хотите чтобы мы рассказали ещё о чём-то - предлагайте тему.

Предложить

Следите за нашими публикациями в социальных сетях и новостных каналах.