• Блог
  • Переводим pdoMenu на Fenom

В этой статье я покажу как используя Fenom можно построить многоуровневое меню с помощью pdoMenu с единственным чанком и забыть про 10 шаблонов (tplOuter, tplInner, tpl, tplHere, tplParentRow, tplParentRowHere, tplParentRowActive, tplInnerRow, tplInnerRowHere, tplCategoryFolder).

Материал рассчитан на разработчиков, свободно владеющими навыками программирования на PHP, а также знакомыми со структурой MODX. Желательно знать азы шаблонизатора Fenom. Новички могут использовать данный материал в режиме «Copy/Paste».

Весь процесс снят на видео. Я постарался сделать это максимально просто.

Контент доступен только для зарегистрированных пользователей.

13 мая 2018, 09:25   1245     15

Комментарии ()

  1. Vladimir 26 мая 2018, 00:27 # +1
    Спасибо, как всегда интересно и практически можно сразу использовать!
    1. Сергей Шлоков 26 мая 2018, 06:26 # +3
      Рад, что понравилось! Думаю, что было бы логично, если бы во всех сниппетах pdoTools была возможность вывода сырых данных для дальнейшей работы с Fenom. Тем более, что именно pdoTools и подключает этот шаблонизатор.
      1. Alex Zhuravlev 1 24 июля 2018, 21:04 # +1
        Спасибо. Интересно очень. Доходчиво и не нудно… не хватает немного фоновой музыки как в видео про лару.
        Удобная реализация, но мне кажется что в pdotools это не попадет )
    2. sergikovich 31 июля 2018, 13:17 # 0
      Отличное решение. Подскажите а как в данном способе использовать TV? Спасибо
      1. sergikovich 31 июля 2018, 14:34 # 0
        Разобрался, спасибо.
      2. Роман 10 февраля 2019, 21:16 # 0
        Здравствуйте, спасибо. А как теперь его стилизовать, например бутстрапом 4?
        1. Сергей Шлоков 11 февраля 2019, 15:48 # 0
          Добрый день! Роман, не расстраивайте меня :(
          1. Роман 11 февраля 2019, 15:51 # 0
            Извините,… я нуб :a
            1. Сергей Шлоков 11 февраля 2019, 15:56 # 0
              Мы все прошли через это. Просто вектор обучения должен быть такой — теория -> практика, а не наоборот.
              1. Роман 11 февраля 2019, 19:56 # 0
                После включения настройки «Использовать Fenom на страницах», ни верстки ни стилей, просто белый экран… отключаю, все норм. хм… А белым он становиться после размещения в шаблоне вызова:
                <ul class="tplOuter">
                {set $items = $_modx->runSnippet('pdoMenuFenom', [
                    'parents' => 0,
                    'displayStart' => true,
                    'toArray' => true,
                ])}
                {foreach $items as $item}
                    {set $item['level'] = 1}
                    {$_modx->getChunk('menu-fenom', ['item'=>$item])}
                {/foreach}
                </ul>
                'menu-fenom' — название моего чанка меню, в котором я разместил код Вашего Чанка Menu
                1. Сергей Шлоков 11 февраля 2019, 20:35 # 0
                  Смотрите журнал ошибок.
        2. Дмитрий Вчера в 14:21 # 0
          Сергей, приветствую.
          Сделал все по инструкции, только через файловый чанк. Все работает, пока особо не настраивал под себя.

          На странице есть два вызова pdoMenu — в верхнем меню (твой вариант) и для вывода нужного контента на самой странице.

          Применяю debugParser.

          В стандартном вызове pdoMenu для вывода нужного контента на странице в режиме debugParser занимает одно поле и выглядит так:
          {!pdoMenu | snippet : Array ( [parents] => 7 [templates] => -6 [sortby] => publishedon [sortdir] => ASK [includeTVs] => seo_name_uslugi [tplOuter] => @FILE chunks/uslugi/all_uslugi_outer.tpl [tpl] => @FILE chunks/uslugi/all_uslugi_tpl.tpl [tplInner] => @FILE chunks/uslugi/all_uslugi_tplInner.tpl [tplInnerRow] => @FILE chunks/uslugi/all_uslugi_tplInnerRow.tpl ) }

          А верхнее меню (твой вариант), выглядит следующим образом.
          Помимо отображения вызова pdoMenu в одном поле:
          {$_modx->runSnippet("pdoMenuFenom", Array ( [parents] => 0 [displayStart] => 1 [toArray] => 1 [includeTVs] => topMenuTitle ) )}
          Ниже идет много полей, в каждом из которых массивы ресурсов (так понимаю, которые должны быть в меню, субменю, субсубменю). То есть получается в debugParser такая простыня из полей с массивами и на выполнение каждого поля уходит от 0.003… до 0.00004… что значительно увеличивает Total parse time

          далее идут поля с сформированными ссылками
          39 	{1 | url} 	0 	0 	0.0000350
          40 	{22 | url} 	0 	0 	0.0000210
          41 	{18 | url} 	0 	0 	0.0000188
          42 	{7 | url}
          ... и т.д. ...


          Подскажи, это так и надо?
          1. Сергей Шлоков Вчера в 19:25 # 0
            что значительно увеличивает Total parse time
            А значительно это насколько?
            1. Дмитрий Вчера в 20:40 # 0
              А значительно это насколько?
              Сергей, твоя реализация в любом случае работает быстрее, чем стандартный вывод, да и намного удобна.

              Однако я спросил…
              Подскажи, это так и надо?

              Если так и должно быть, то можно еще как-то оптимизировать и не выводить лишние (ненужные) данные. Может фраза «не выводить» неверна, ну я думаю ты меня понял.

              Может я путаюсь в терминологии, но я не программист и не очень давно знаком с MODX, прошу строго не судить.
              1. Сергей Шлоков 9 часов назад # 0
                Ответ на поверхности. debugParser фиксирует всё, что проходит через парсер. В стандартном варианте тег один, а вся логика спрятана в классе. debugParser её не видит. А в моём варианте логика вынесена наружу и все теги фиксируются. Вот и всё. Какая тут нужна оптимизация, я не совсем понимаю.

          Вы должны авторизоваться, чтобы оставлять комментарии.

          Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.