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

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

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

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

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

1   1766

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

  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. Дмитрий 17 февраля 2019, 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. Сергей Шлоков 17 февраля 2019, 19:25 # 0
            что значительно увеличивает Total parse time
            А значительно это насколько?
            1. Дмитрий 17 февраля 2019, 20:40 # 0
              А значительно это насколько?
              Сергей, твоя реализация в любом случае работает быстрее, чем стандартный вывод, да и намного удобна.

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

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

              Может я путаюсь в терминологии, но я не программист и не очень давно знаком с MODX, прошу строго не судить.
              1. Сергей Шлоков 18 февраля 2019, 06:38 # 0
                Ответ на поверхности. debugParser фиксирует всё, что проходит через парсер. В стандартном варианте тег один, а вся логика спрятана в классе. debugParser её не видит. А в моём варианте логика вынесена наружу и все теги фиксируются. Вот и всё. Какая тут нужна оптимизация, я не совсем понимаю.
          2. Момотов Роман 09 марта 2019, 19:13 # 0
            Здравствуйте, не подскажете как сделать что бы подменю 3 уровня(level3) выводилось на одном уровне в dom дереве с подменю второго уровня (level2) т.е. не было вложено в него и в то же время, подменю 2 и 3 уровней оба находились внутри первого уровня меню?
            1. Сергей Шлоков 10 марта 2019, 11:33 # 0
              Лично я бы сгенерировал новый массив, в котором объединил бы 2-й и 3-й уровни.
              1. Момотов Роман 10 марта 2019, 12:36 # 0
                если вам не сложно, можете объяснить по подробнее, а то моё знакомство с Fenom распространяется лишь на настройку minishop2 да и то уже по готовым чанкам
                1. Момотов Роман 18 марта 2019, 18:25 # 0
                  и снова здравствуйте, как объединить 2-й и 3-й уровни, это в чанке прописывать, или в шаблоне?
                  1. Сергей Шлоков 19 марта 2019, 07:31 # 0
                    Можно в чанке, можно доработать сниппет.
                    1. Момотов Роман 19 марта 2019, 09:40 # 0
                      да, очень информативно
                      1. Сергей Шлоков 19 марта 2019, 11:45 # 0
                        Роман, если Вы решили, что я мучаюсь бездельем и жду возможности каждому новичку решать задачи, то я Вас огорчу — Вы не по адресу. Я могу помочь советом. Это моя принципиальная жизненная позиция. Человек должен сам искать решение. И я, когда учился программировать, никогда не просил сделать за меня какие-то задачи.
                        Меня вообще удивляет ситуация, когда люди без опыта устраиваются на работу, получают проекты, а потом везде пишут: «Помогите, сроки горят, я не успеваю/не знаю/, напишите как нужно.» Мне по несколько запросов в месяц таких приходят. Хотите обижайтесь, хотите нет, но у меня по этому вопросу позиция жесткая — ищите халяву в другом месте.

                        да, очень информативно
                        Вы спрашивали —
                        это в чанке прописывать, или в шаблоне?
                        Я ответил. Попробуйте обратиться в сообщество. Возможно там кому-то эта задача покажется интересной.
                        1. Момотов Роман 19 марта 2019, 13:07 # 0
                          Справедливо :a

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

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