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 may 2016, 18:16    Сергей Шлоков   G+  
10    1222 +12

Comments (31)

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

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

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

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

                        А вот с плагинами всё сложнее. Но придумать что-то можно. Вопрос, насколько это получится юзабительно.
                      2. Сергей Шлоков 11 may 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 may 2016, 19:12 # +3
                          Василий, а как ты смотришь, чтобы добавить этот функционал в pdoTools?
                          1. Василий Наумкин 12 may 2016, 19:13 # +3
                            Давно уже об этом думаю, но пока что занят новой версией miniShop2.
                            1. Сергей Шлоков 12 may 2016, 19:39 # +1
                              Может пулреквест ускорит процесс? )
                              1. Василий Наумкин 12 may 2016, 19:40 # 0
                                Не ускорит.
                          2. Владимир 12 may 2016, 19:39 # +2
                            Ждем`с в pdoTools!
                            Лишь отсутствие поддержки в modDevTools фенома и новых статичных чанков (снипетов) весьма печалит.
                            Верю, прогресс победит! ))
                            1. Владимир 13 may 2016, 14:03 # 0
                              Обращаюсь к автору modDevTools с просьбой о добавлении чанков и снипетов к шаблону в ручном режиме, через настройки, в случае использования фенома. Что бы редактирование элементов было под рукой.
                            You need to login to create comments.