Fenom. Загрузка чанков и сниппетов из файлов


Продолжаю эксперименты с загрузкой чанков и сниппетов из файлов. Мой первый эксперимент с парсером оказался не очень удачный. Хотя задачу он решал, но ожидания были немного другие. А поближе познакомившись с феномом, нашел, как мне кажется, хорошее решение — модификаторы. Дальше для тех, кому это интересно.

Немного о причинах

Не знаю почему, но не нравится мне хранить чанки и сниппеты в базе. Это анахронизм. Нигде такого нет. Статические элементы не сильно улучшают эту проблему. Я не профессиональный разработчик, больше экспериментатор-любитель. И вот потихоньку допиливая свой сайт сталкиваюсь с некоторыми неудобствами — чтобы поменять какой-то интерфейс нужно лезть в админку, править чанк или сниппет (если править статический файл, то нужно сбросить кэш). После сохранения элемента, сбрасывается кэш всего сайта. Иногда чтобы найти вызов нужного чанка или сниппета, приходится потратить время. Да и с версионностью в базе не очень. Я сейчас имею ввиду собственные модули разработчиков, а не пакеты. С ними проблем версионности нет, все файлы есть на диске (да и не правят их нормальные разработчики). Конечно, есть несколько решений — gitify, обновлять сайт пакетами. Но хочется что-то простое и понятное. Вот тут приходит на помощь pdoTools с феномом, у которого уже есть встроенная возможность указывать свои модификаторы (спасибо Василию).

Решение

Базовый функционал pdoTools позволяет работать с файлами только для чанков, а также добавлять в феном свои модификаторы, правда используя для этого сниппет MODX. Поэтому я немного расширил этот функционал и создал 2 класса, расширяющих pdoTools и FenomX.
Теперь мой шаблон выглядит так
<!DOCTYPE html>
<html lang="ru">
<head>
    [[-$Head]]
    {'head.html' | chunk}
</head>
<body>
    [[-$Navbar]]
    {'navbar.html' | chunk}
    <div class="main-wrapper">
        [[-$Crumbs]]
        {'crumbs.html' | chunk}
    	<div class="container">
    	    <div class="row">
    	        <article class="col-sm-8">
                    <header class="page-header">
                        <h1 class="page-title">[[*longtitle]]</h1>
                    </header>
                    [[*content]]
                </article>
                <!-- Sidebar -->
                <aside class="col-sm-4 sidebar sidebar-right">
                    <!-- Было -->
                    [[-$Widget.User]]
                    [[-$Widget.Search]]
                    [[-$Widget.Tags]]
                    [[-$Widget.RelatedActicles]]
                    <!-- Стало -->
                    {'widgets/user.html' | chunk}
                    {'widgets/search.html' | chunk}
                    {'widgets/tags.html' | chunk}
                    {'widgets/relatedArticles.html' | chunk}
                </aside>
    	    </div>
        </div>
    </div>
    [[-$Footer]]
    {'footer.html' | chunk}
    
    [[-$Modal.Auth]]
    {'modalAuth.html' | chunk}

    [[-!OrphoMan? &loadjGrowl=`0`]]
    {'snippet.orphoman' | snippet : ['tplPath'=>'core/components/orphoman/elements/snippets', 'loadjGrowl'=>0, 'min'=>5, 'max'=>100, 'tpl'=>'orphoman.confirm.dlg', 'tplButton'=>'orphoman.foundMistake.btn']}
</body>
</html>
Я специально оставил старые вызовы чанков и сниппетов MODX для наглядности. В конце можно увидеть вызов сниппета из компонента Orphoman с параметрами. Т.е. можно не только свои сниппеты вызывать.

Я не ставил задачу увеличить скорость. Даже был готов к небольшому повышению времени загрузки страницы. Всё-таки MODX кэширует всю страницу, а тут чанки грузятся каждый раз. Но оказалось, что разницы нет. Возможно из-за отсутствия обращения к базе данных.
Вызовы сниппетов pdoTools я также переделал на обращение к файлу, используя модификатор @FILE.

Инструкция

Кладём файлы pdotoolsplus.class.php и _fenomplus.php в папку core/components/pdotools/model/pdotools/ рядом с базовыми классами pdotools.
Дальше в системной настройке pdoTools.class указываем наш новый класс pdotools.pdotoolsplus.
Теперь вы спокойно может вызывать чанки и сниппеты из файлов в шаблонах и чанках используя следующий синтаксис
// Чанки
{'chunk.html' | chunk}
{'chunk.tpl' | chunk} // расширение tpl можно опустить
{'chunk' | chunk} // будет вызываться файл chunk.tpl
{'chunk.html' | chunk : ['tplPath'=>'folder/subfolder', 'param1'=>'значение1']}
{'subfolder/chunk.html' | chunk : ['tplPath'=>'assets/chunks', 'param1'=>'значение1']}

// Сниппеты
{'сниппет' | snippet}
{'сниппет.php' | snippet}
// C параметрами. Они будут доступны в сниппете ввиде $param1 и в виде $scriptProperties['param1']
{'сниппет' | snippet : ['param1'=>'значение1', 'param2'=>'значение2']} 
По-умолчанию, директория для чанков — core/elements/chunks/. А для сниппетов — core/elements/snippets/. Но её можно переопределить в параметре tplPath.
У чанков допустимые расширения html и tpl. У сниппетов php. Расширения tpl и php можно не указывать.
Для загрузки чанков из файла используется базовый функционал pdoTools. А вот для загрузки сниппетов добавлен метод includeSnippet() по аналогии с runSnippet(). Его, кстати, можно использовать и в обычных сниппетах для загрузки нужного сниппета из файла — $pdoTools->includeSnippet('name', array('param1'=>'value1')).

Заключение

Какие задачи решает данный способ?
  • Чанки и сниппеты хранятся на диске, поэтому MODX не тратит время на запросы в базу данных.
  • Теперь не надо заходить в админку. Например, я редактирую элементы в phpStorm, а он их заливает на сайт.
  • При изменении элемента кэш сайта не сбрасывается — результат виден сразу, на время загрузки страницы это никак не влияет.
  • Модули теперь поддерживают версионность.
  • Теперь удобно искать свои чанки и сниппеты в phpStorm (CTRL+SHIFT+F).
  • Ну и возможность скрыть от менеджеров функционал, чтобы не напортачили. Главное, чтобы вкладка с файлами была выключена.
В общем, кому интересно, пробуйте. Это, как я писал выше, эксперимент.

П.С. Наверно, можно было сделать один модификатор file и в зависимости от расширения загружать чанки или сниппеты.
11 мая 2016, 18:16    Сергей Шлоков   G+  
12    1577 +12

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

  1. Илья Уткин 11 мая 2016, 19:28 # +4
    По поводу выбора папки по умолчанию.

    На мой взгляд — некорректно хранить чанки и сниппеты в assets. Куда логичнее было бы хранить их в core. Все-таки папка core обычно закрыта для доступа извне, а в assets все файлы доступны по прямым ссылкам. Тем более, что сниппеты хранятся в виде php-файлов.
    1. Илья Уткин 11 мая 2016, 19:32 # +3
      А так, метод интересный, причем куда проще статических файлов
      1. Сергей Шлоков 11 мая 2016, 19:40 # 0
        Спасибо.
      2. Сергей Шлоков 11 мая 2016, 19:33 # +1
        Если честно, у меня так и есть. Но я использовал базовый функционал pdoTools. Правда это для чанков.
        Можно указать любой путь в параметре tplPath. А можно вообще свой путь прописать в классе. Или завязать его на системную настройку.
        1. Сергей Шлоков 11 мая 2016, 20:05 # +3
          Переделал на CORE
          1. Alexander V 13 мая 2016, 13:06 # -1
            Чанки это же элементы оформления. В assets им как раз самое место.
            1. Илья Уткин 13 мая 2016, 13:43 # +2
              До тех пор, пока в них не используется Феном или не прописана какая-то логика с помощью, например, модификаторов. А в MODX легко можно такую логику накрутить в чанках и шаблонах…

              Поищите в гугле какие-нибудь теги MODX (например, [[*longtitle:default=`[[*pagetitle]]`]])
              1. Alexander V 13 мая 2016, 14:09 # -1
                И что? От этого чанк перестает быть элементом оформления?
                1. Павел Гвоздь 14 мая 2016, 14:10 # +1
                  От этого безопасность страдает…
                  1. Alexander V 14 мая 2016, 14:13 # -2
                    Это паранойя.
                    1. Владимир 14 мая 2016, 14:41 # 0
                      Интересно, вот скажи, а нормально, что эти файлы попадают в поисковый индекс и доступны извне? Просто обоснуй, почему ты считаешь так или иначе.
                      1. Alexander V 14 мая 2016, 14:59 # -3
                        У нормальных пацанов фильтры отрабатывают на сервере, а не вываливаются исходники. Перейди по ссылки и посмотри title.
                        1. Alexander V 14 мая 2016, 15:00 # 0
                          -
                          1. Владимир 14 мая 2016, 16:48 # +1
                            Странный пример ты привел. Тем более, что в приведенном примере наружу все, и far*****ood.com/core/components/ и fa*******ood.com/core/packages/ и т.п.
                            100% тебя ни кто не заставляет ни чего прятать. Но видимо и не все согласны с твоим мнением относительно этого (и вроде все нормальные пацаны :)) ).
                            Мне кажутся неправильными расширения для файлов чанков .html, IMHO .tpl уже не так «бегут» индексироваться. А расположение в core очень логично.
                            Но каждый сам решает, как ему виднее.
                            1. Alexander V 14 мая 2016, 17:31 # 0
                              Дело хозяйское, где располагать. По вашей логике надо размазать оформление по всей система. Половина в core, вторая в assets. Есть масса способов закрыть доступ в директорию.
                              1. Владимир 14 мая 2016, 17:35 # +1
                                В assets — все что можно получить по прямой ссылке, css, js, медиафайлы и т.п., а все что содержит хоть какую то логику логичнее скрыть. А это чанки с модификаторами и феномом, например. Об этом же речь.
                                1. Alexander V 14 мая 2016, 17:39 # -1
                                  Ну и пусть лежат эти чанки в assets. Рассказать, как закрыть доступ в директорию или без меня знаешь?
                                  1. Владимир 14 мая 2016, 17:48 # +1
                                    ))) спасибо, не надо.
                        2. Сергей Шлоков 14 мая 2016, 18:16 # 0
                          Интересно каким образом это попадает в индекс. Робот же бегает по ссылкам, а не по папкам.
                          1. Владимир 14 мая 2016, 18:28 # 0
                            И по папкам тоже. Факт, что, например, файлы .html шаблона лежащие в папке до того как их «натянешь на движок» оказываются в индексе. Стоит их забыть удалить и они там, в индексе, особенно в Google.
                            1. Сергей Шлоков 14 мая 2016, 18:35 # +2
                              Значит их надо закрывать в robots.txt.
                              1. Владимир 14 мая 2016, 18:38 # 0
                                логично, но robots.txt доступен любому пользователю, хотя директории закрытые то пусть знают, на здоровье.
                    2. Sem 11 мая 2016, 20:32 # +3
                      Респект и уважуха автору, подняли наконец очень важную и интересную тему, я всецело за разработку из вне, а наполнение контентом из админки. Только вот у меня была идея реализовать это всё по типу modxSmarty + elementsHelper — всё — шаблоны — чанки — сниппеты — tv — плагины — всё это вынесено в файлы и редактируется из любимой ide phpstorm с подключенным дистрибутивом MODX, который на каждом шагу помогает автоподсказками своего API — рай для разработки сайта — всё под рукой — в одном месте. Но вот ребята MODX club (авторы modxSmarty) закрылись от сообщества, отвечают на вопросы мягко говоря не охотно, а идея то дополнения просто шикарная, так вот вопрос автору — Сергей, может попробовать слепить свой такой modxFenom, который поможет вашим единомышленникам и мне в том числе, вынести разработку на MODX во внешнюю среду, при этом используя все прелести pdoTools с Fenom — просто весь код будет отдельно, у меня пока не достаточно опыта в бекенд-программировании — я фронтендщик и лишь постигаю MODX — сейчас все проекты делаю на modxSmarty — скорость работы сайтов впечатляет — а с Fenom будет ещё круче. Если идея понравится — готов помочь рублем — просто уже давно греется у меня эта идея — но Василию не хотел писать об этом, так как у них с автором (modxSmarty) разные взгляды на разработку, поэтому здорово, что тема всплыла в сообществе.
                      1. Сергей Шлоков 11 мая 2016, 22:15 # +1
                        Я не знаком с modxSmarty. Если он всё это уже умеет, то какой смысл его повторять. Кроме того, вот-вот должен выйти MODX 3. По-моему, там в базе только контент, остальное в файлах.
                        Мое решение можно использовать и для шаблонов. Создать один единственный шаблон и в нем вызывать сниппет, в котором определять всю логику для страниц. Например, так
                        {set $rid = $_modx->resource.id}
                        {'getTemplate' | snippet : ['resource'=>$rid}
                        
                        А с этим сниппетом работать в редакторе. Или чанки прописать и работать с ними. Смотри мой пример шаблона.

                        TV вообще нет смысла выносить в файлы. Они являются расширением таблиц.

                        А вот с плагинами всё сложнее. Но придумать что-то можно. Вопрос, насколько это получится юзабительно.
                      2. Сергей Шлоков 11 мая 2016, 23:24 # 0
                        Кстати, изначально хотел сделать вызов сниппета с модификаторами как в pdoTools для чанков
                        // Вызов из файла
                        $pdoTools->runSnippet('@FILE snippet', $properties);
                        // Динамически создаваемый сниппет для маленьких сниппетов
                        $pdoTools->runSnippet('@INLINE return date('Y-m-d', $scriptProperties['createdon']);', $properties);
                        
                        А если модификаторов нет, то pdoTools запускает $modx->runSnippet(). Но потом решил, что includeSnippet() понятнее, а динамические сниппеты — не нужные излишества.
                        А вы как считаете?
                        1. Сергей Шлоков 12 мая 2016, 19:12 # +3
                          Василий, а как ты смотришь, чтобы добавить этот функционал в pdoTools?
                          1. Василий Наумкин 12 мая 2016, 19:13 # +3
                            Давно уже об этом думаю, но пока что занят новой версией miniShop2.
                            1. Сергей Шлоков 12 мая 2016, 19:39 # +1
                              Может пулреквест ускорит процесс? )
                              1. Василий Наумкин 12 мая 2016, 19:40 # 0
                                Не ускорит.
                          2. Владимир 12 мая 2016, 19:39 # +2
                            Ждем`с в pdoTools!
                            Лишь отсутствие поддержки в modDevTools фенома и новых статичных чанков (снипетов) весьма печалит.
                            Верю, прогресс победит! ))
                            1. Владимир 13 мая 2016, 14:03 # 0
                              Обращаюсь к автору modDevTools с просьбой о добавлении чанков и снипетов к шаблону в ручном режиме, через настройки, в случае использования фенома. Что бы редактирование элементов было под рукой.
                            Вы должны авторизоваться, чтобы оставлять комментарии.