Fenom. Загрузка чанков и сниппетов из файлов
Продолжаю эксперименты с загрузкой чанков и сниппетов из файлов. Мой первый эксперимент с парсером оказался не очень удачный. Хотя задачу он решал, но ожидания были немного другие. А поближе познакомившись с феномом, нашел, как мне кажется, хорошее решение — модификаторы. Дальше для тех, кому это интересно.
Теперь мой шаблон выглядит так
Я не ставил задачу увеличить скорость. Даже был готов к небольшому повышению времени загрузки страницы. Всё-таки MODX кэширует всю страницу, а тут чанки грузятся каждый раз. Но оказалось, что разницы нет. Возможно из-за отсутствия обращения к базе данных.
Вызовы сниппетов pdoTools я также переделал на обращение к файлу, используя модификатор @FILE.
Дальше в системной настройке pdoTools.class указываем наш новый класс pdotools.pdotoolsplus.
Теперь вы спокойно может вызывать чанки и сниппеты из файлов в шаблонах и чанках используя следующий синтаксис
У чанков допустимые расширения html и tpl. У сниппетов php. Расширения tpl и php можно не указывать.
Для загрузки чанков из файла используется базовый функционал pdoTools. А вот для загрузки сниппетов добавлен метод includeSnippet() по аналогии с runSnippet(). Его, кстати, можно использовать и в обычных сниппетах для загрузки нужного сниппета из файла — $pdoTools->includeSnippet('name', array('param1'=>'value1')).
П.С. Наверно, можно было сделать один модификатор file и в зависимости от расширения загружать чанки или сниппеты.
Немного о причинах
Не знаю почему, но не нравится мне хранить чанки и сниппеты в базе. Это анахронизм. Нигде такого нет. Статические элементы не сильно улучшают эту проблему. Я не профессиональный разработчик, больше экспериментатор-любитель. И вот потихоньку допиливая свой сайт сталкиваюсь с некоторыми неудобствами — чтобы поменять какой-то интерфейс нужно лезть в админку, править чанк или сниппет (если править статический файл, то нужно сбросить кэш). После сохранения элемента, сбрасывается кэш всего сайта. Иногда чтобы найти вызов нужного чанка или сниппета, приходится потратить время. Да и с версионностью в базе не очень. Я сейчас имею ввиду собственные модули разработчиков, а не пакеты. С ними проблем версионности нет, все файлы есть на диске (да и не правят их нормальные разработчики). Конечно, есть несколько решений — 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 и в зависимости от расширения загружать чанки или сниппеты.
Комментарии: 34
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
На мой взгляд — некорректно хранить чанки и сниппеты в assets. Куда логичнее было бы хранить их в core. Все-таки папка core обычно закрыта для доступа извне, а в assets все файлы доступны по прямым ссылкам. Тем более, что сниппеты хранятся в виде php-файлов.
Можно указать любой путь в параметре tplPath. А можно вообще свой путь прописать в классе. Или завязать его на системную настройку.
Поищите в гугле какие-нибудь теги MODX (например, [[*longtitle:default=`[[*pagetitle]]`]])
100% тебя ни кто не заставляет ни чего прятать. Но видимо и не все согласны с твоим мнением относительно этого (и вроде все нормальные пацаны :)) ).
Мне кажутся неправильными расширения для файлов чанков .html, IMHO .tpl уже не так «бегут» индексироваться. А расположение в core очень логично.
Но каждый сам решает, как ему виднее.
Мое решение можно использовать и для шаблонов. Создать один единственный шаблон и в нем вызывать сниппет, в котором определять всю логику для страниц. Например, так
А с этим сниппетом работать в редакторе. Или чанки прописать и работать с ними. Смотри мой пример шаблона.
TV вообще нет смысла выносить в файлы. Они являются расширением таблиц.
А вот с плагинами всё сложнее. Но придумать что-то можно. Вопрос, насколько это получится юзабительно.
А если модификаторов нет, то pdoTools запускает $modx->runSnippet(). Но потом решил, что includeSnippet() понятнее, а динамические сниппеты — не нужные излишества.
А вы как считаете?
Лишь отсутствие поддержки в modDevTools фенома и новых статичных чанков (снипетов) весьма печалит.
Верю, прогресс победит! ))
Сделал все по инструкции, но не работает.
MODX Revo + pdoTools — последней версии.
Файлы положил куда надо, чанки тоже сохранил в соответствующую папку, сменил pdoTools.class, но в итоге вместо содержимого чанков показывает просто:
Не обрабатывает теги.
Как поправить?
Надо было в настройках pdoTools разрешить Fenom на страницах и MODX разрешить.