[pdoTools] Версия 2.0 с шаблонизатором и кэшем
Доступна стабильная версия pdoTools 2.0, в которой я уже определился, как именно должен работать шаблонизатор Fenom.
Во-первых, добавлены системные настройки, которые позволяют обезопасить выполнение шаблонов Fenom от потенциально нехороших пользователей админки, а то и вовсе его отключить.
Во-вторых, улучшена работа с кэшем как чанков Fenom, так и pdoMenu.
Сначала настройки:

Еще одним важным изменением является доработанный порядок обработки страниц сайта. Теперь, если включен pdoParser и системная опция pdotools_fenom_parser, то шаблонизатор запускается ровно вот здесь.
В этот момент все кэшированные чанки и сниппеты на странице обработаны (или загружены из кэша) и вы можете использовать вот такие конструкции:
Таким образом, вы можете реализовывать гораздо более сложную логику работы сайта даже с отключенными опциями pdotools_fenom_php и pdotools_fenom_modx. Понятное дело, что вызов тегов Fenom на страницах сайта никак не кэшируется.
Внутри чанков Fenom всегда выполняется в первую очередь, позволяя также разделять их содержимое для MODX, в зависимости от условий.
По умолчанию этот функционал Fenom отключен, потому что по моим тестам, толку от него в MODX нет. Но, это на моих мелких и простых чанках, а у вас может быть что-то посложнее.
Поэтому вы можете включить системную настройку pdotools_fenom_cache и тогда скомпилированные шаблоны будут сохранены в /cache/default/fenom/ в зависимости от своего типа.
Чанки из БД кэшируются под своими id, а INLINE именуются как хэш от своего содержимого, то есть — путь к обычному чанку будет выглядеть как cache/default/fenom/chunk/90.cache.php, а к INLINE уже как cache/default/fenom/inline/35e115c27fdc3814b6f41a1015aa67e6.cache.php.
Отсюда следует, что нормальные чанки из БД кэшируются намертво, и обновляются только при очистке системного кэша, а INLINE чанки при изменении контента сохраняются под новым именем и весь кэш чистить не нужно.
Как это работает дальше?
При первом запуске с пустым кэшем pdoTools получает нужный чанк, определяет его тип и отдаёт в Fenom.
Тот компилирует шаблон и сохраняет его во внутренний кэш pdoTools методом setStore(). Этот кэш находится в ОЗУ и сохраняется только на время выполнения скрипта, он нужен чтобы не компилировать 10 раз один и тот же чанк при выводе pdoResources.
А вот если включена опция pdotools_fenom_cache, то исходный код скомпилированного шаблона сохраняется на HDD сервера, и при следующем запуске Fenom уже не нужно его компилировать. Кэшер MODX отдаёт исходный код, из него получается объект Fenom\Render который передаётся в setStore() и оттуда уже работает.
Собственно, вопрос в том, что для вас будет быстрее — поднять скомпилированный шаблон из кэша, или скомпилировать его заново.
Обычно выходит, что на маленьких и простых чанках (как у сниппетов pdoTools) выигрыша нет, а лишних файлов много, а вот на больших и сложных чанках (которые вы наверняка создадите, используя возможности Fenom) разница уже может быть. Время компиляции и работы с кэшем выводится в &showLog=`1`, так что каждый может проверить сам.
В новой версии доработаны методы pdoTools::setCache() и pdoTools::getCache(), так что теперь данные всегда сохраняются в /cache/default/. А если указан параметр &cache_key, то данные будут сохраняться под этим именем для всех страниц сайта.
Из этого следует улучшение pdoMenu, который при включенном параметре &cache=`1` сохраняет чистые данные, а при загрузке страницы тратит время только на оформление чанков.
Меню кэшируется один раз для всего сайта и работает без каких-либо проблем на всех страницах, правильно показывая активные пункты.
А вот pdoPage работает как и прежде, кэшируя уже готовый вывод запущенного внутри него сниппета, сохраняя его только для своей страницы.
Разница в том, что меню, как правило, для всех страниц сайта одинаковое, а пагинация в документах уникальна.
Возможно, в будущем я научу pdoResources также кэшировать данные, как и pdoMenu, и тогда pdoPage не нужно будет сохранять уже обработанный вывод.
Это зависит от ваших отзывов касательно новой работы меню.
В стабильной версии pdoTools 2.0 добавлены системные параметры для ограничения потенциально опасных функций нового шаблонизатора Fenom, улучшен кэш pdoMenu и заложен функционал для развития кэширования в других сниппетах.
Дополнение доступно как в нашем репозитории, так и в официальном. На данный момент совокупное количество закачек pdoTools составляет почти 45 000 раз, при этом тестовые сайты на modhost.pro никак не учитывается.
Планы на будущее:
В версии pdoTools 2.0.1-pl системная настройка pdotools_fenom_modx отключена по умолчанию, из соображений безопасности.
Во-первых, добавлены системные настройки, которые позволяют обезопасить выполнение шаблонов Fenom от потенциально нехороших пользователей админки, а то и вовсе его отключить.
Во-вторых, улучшена работа с кэшем как чанков Fenom, так и pdoMenu.
Сначала настройки:

- pdotools_fenom_default включает обработку синтаксиса Fenom во всех чанках сайта.
- pdotools_fenom_parser включает обработку синтаксиса Fenom на страницах сайта. Контент ресурсов, шаблоны — везде. По умолчанию отключено.
- pdotools_fenom_php включает возможность выполнения произвольных функций PHP в шаблонах через {$.php.функция()}. Опция эта очень опасная, так что тоже отключена.
- pdotools_fenom_modx — чуть менее опасная опция, но во многих случаях, пока, необходимая — работа с объектами modX и pdoTools через переменные {$modx} и {$pdoTools}. Если вы не доверяете своим менеджерам — выключите её от греха подальше, потому что через объект modX можно удалить начисто весь сайт.
- pdotools_fenom_cache — включает кэшированние чанков (только чанков, не страниц сайта) через кэшер MODX (а не как раньше). Стоит использовать только на продакшн сайтах при больших и сложных чанках.
Порядок запуска шаблонизатора
Еще одним важным изменением является доработанный порядок обработки страниц сайта. Теперь, если включен pdoParser и системная опция pdotools_fenom_parser, то шаблонизатор запускается ровно вот здесь.
В этот момент все кэшированные чанки и сниппеты на странице обработаны (или загружены из кэша) и вы можете использовать вот такие конструкции:
{if $.get.test == 1}
[[!pdoResources?parents=`0`]]
{else}
[[!pdoMenu?parents=`0`]]
{/if}То есть, в зависимости от $_GET['test'] на странице будет запущен или один сниппет или другой. Парсер MODX же запустил бы оба и результат выполнения одного неподходящего просто не показал.Таким образом, вы можете реализовывать гораздо более сложную логику работы сайта даже с отключенными опциями pdotools_fenom_php и pdotools_fenom_modx. Понятное дело, что вызов тегов Fenom на страницах сайта никак не кэшируется.
Внутри чанков Fenom всегда выполняется в первую очередь, позволяя также разделять их содержимое для MODX, в зависимости от условий.
Кэширование чанков Fenom
По умолчанию этот функционал Fenom отключен, потому что по моим тестам, толку от него в MODX нет. Но, это на моих мелких и простых чанках, а у вас может быть что-то посложнее.
Поэтому вы можете включить системную настройку pdotools_fenom_cache и тогда скомпилированные шаблоны будут сохранены в /cache/default/fenom/ в зависимости от своего типа.
Чанки из БД кэшируются под своими id, а INLINE именуются как хэш от своего содержимого, то есть — путь к обычному чанку будет выглядеть как cache/default/fenom/chunk/90.cache.php, а к INLINE уже как cache/default/fenom/inline/35e115c27fdc3814b6f41a1015aa67e6.cache.php.
Отсюда следует, что нормальные чанки из БД кэшируются намертво, и обновляются только при очистке системного кэша, а INLINE чанки при изменении контента сохраняются под новым именем и весь кэш чистить не нужно.
Как это работает дальше?
При первом запуске с пустым кэшем pdoTools получает нужный чанк, определяет его тип и отдаёт в Fenom.
Тот компилирует шаблон и сохраняет его во внутренний кэш pdoTools методом setStore(). Этот кэш находится в ОЗУ и сохраняется только на время выполнения скрипта, он нужен чтобы не компилировать 10 раз один и тот же чанк при выводе pdoResources.
А вот если включена опция pdotools_fenom_cache, то исходный код скомпилированного шаблона сохраняется на HDD сервера, и при следующем запуске Fenom уже не нужно его компилировать. Кэшер MODX отдаёт исходный код, из него получается объект Fenom\Render который передаётся в setStore() и оттуда уже работает.
Собственно, вопрос в том, что для вас будет быстрее — поднять скомпилированный шаблон из кэша, или скомпилировать его заново.
Обычно выходит, что на маленьких и простых чанках (как у сниппетов pdoTools) выигрыша нет, а лишних файлов много, а вот на больших и сложных чанках (которые вы наверняка создадите, используя возможности Fenom) разница уже может быть. Время компиляции и работы с кэшем выводится в &showLog=`1`, так что каждый может проверить сам.
Кэширование pdoMenu
В новой версии доработаны методы pdoTools::setCache() и pdoTools::getCache(), так что теперь данные всегда сохраняются в /cache/default/. А если указан параметр &cache_key, то данные будут сохраняться под этим именем для всех страниц сайта.
Из этого следует улучшение pdoMenu, который при включенном параметре &cache=`1` сохраняет чистые данные, а при загрузке страницы тратит время только на оформление чанков.
Меню кэшируется один раз для всего сайта и работает без каких-либо проблем на всех страницах, правильно показывая активные пункты.
А вот pdoPage работает как и прежде, кэшируя уже готовый вывод запущенного внутри него сниппета, сохраняя его только для своей страницы.
Разница в том, что меню, как правило, для всех страниц сайта одинаковое, а пагинация в документах уникальна.
Возможно, в будущем я научу pdoResources также кэшировать данные, как и pdoMenu, и тогда pdoPage не нужно будет сохранять уже обработанный вывод.
Это зависит от ваших отзывов касательно новой работы меню.
Заключение
В стабильной версии pdoTools 2.0 добавлены системные параметры для ограничения потенциально опасных функций нового шаблонизатора Fenom, улучшен кэш pdoMenu и заложен функционал для развития кэширования в других сниппетах.
Дополнение доступно как в нашем репозитории, так и в официальном. На данный момент совокупное количество закачек pdoTools составляет почти 45 000 раз, при этом тестовые сайты на modhost.pro никак не учитывается.
Планы на будущее:
- Обновление документации на docs.modx.pro/components/pdotools/
- Подумать над кэшированием других сниппетов
- Попробовать подружить debugParser с Fenom
- Добавление новых тегов Fenom, чтобы можно было вызывать сниппеты, чанки и строки лексикона без объекта {$modx}
Обновлено 31.05.2015
В версии pdoTools 2.0.1-pl системная настройка pdotools_fenom_modx отключена по умолчанию, из соображений безопасности.
Комментарии: 46
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Раньше &cache_key указывал только префикс для кэша — директорию куда его складывать. Сейчас префикс по умолчанию default, если указывается свой &cache_key. Если не указывается, то для pdoPage генерируется ключ по старому алгоритму, который отправляет его в кэш ресурса.
То есть, указав произвольную строку можно получить кэширование сниппета для всех страниц сайта. Но в случае с pdoPage это не имеет смысла, потому что контент меняется в зависимости от номера страницы, поэтому там лучше оставить автоматическую работу.
Но, если вдруг тебе необходимо на разных страницах сайта выводить один и тот же контент, с одной и той же постраничной навигацией, то теперь можно сделать и так:
Еще раз повторяю — раньше такого не было, ты просто менял директорию для хранения кэша, а внутри там всё равно были пути к ресурсам.
Сейчас всё гораздо круче:
У нас здесь тысячи страниц выводятся без кэша — и нет проблем. Как так?
Обновившись, прогнал эти вызовы еще раз и получается тоже самое, если:
— возможен частый вызов пустого чанка то pdoTools, потому что не делает запрос при пустом значении
— чанк всегда выводится, то $modx, потому что не делает лишние запросы на вызов чанка
Есть ли выигрышн во времени пока проверить возможности нет.
Что там, что там в итоге вызывается метод MODX и дальше всё время уходит ему. Поэтому используй что удобнее.
Мне больше нравится новый синтаксис, потому что там нормальные массивы и типы переменных.
В конце концов, любые изменения оформления сайта — это разработка, и её нужно проверять.
Я пытался сделать в шаблоне так
В настройках установил параметр
но мне вывело не обработаное. Что я делаю не так. Как вообще это всё работает. Уж очень нужная и полезная штука, хотелось бы разобраться.
После изменения системных настроек бывает полезно обновить кэш сайта.
PdoTools плюс Fenom — это круто!
Чего лично мне не хватало в pdoTools, так это для какой то конкретной, выводимой в ленте сайта статьи, использовать свое оформление не злоупотребляя модификаторами в чанках, т.е. понятно, что четные, нечетные и NN-е чанки-шаблоны многое решали, но теперь можно легко менять оформление комбинируя с различными условиями.
Шикарно)
Может быть, просто неправильный код не компилируется — смотри в логе ошибок.
Имеем такую конструкцию в чанке:
В параметрах указан 'parents' ([[*id]] либо [[*parent]]) и 'tplStart' (@INLINE ...)
Результат — полный список всех ресурсов, как будто «parents=`0`».
Прописываю:
Результат такой же.
Только если прописать все параметры непосредственно в чанке (без набора параметров), работает как нужно.
С [[mFilter2]] такая же конструкция работает нормально, а тут вообще наборы не работают.
Работа [[pdoMenu]] так задумана или я снова где-то накосячил?
Сделай там в начале сниппета
и посмотри, что приходит.
А что можно сделать в таком случае?
Как-то так:
Даже лучше так:
После обработки Fenom останется всё равно только один вызов.
В логе ошибок нет, просто не «отрабатывают» плейсхолдеры фенома и выводится:
как в сниппете AjaxForm указать плейсхолдеры, принимаемые из формы и передаваемые в FormIt? Раньше синтаксис был такой:
а как это сделать через fenom?
вот до чего дошел:
Никак не могу взять в толк, откуда fenom'у взять эти плейсхолдеры и передать в сниппет Formit
Полный вызов сниппета
И второй вопрос-предложение — можешь добавить в блок приглашения к авторизации, на месте создания комментария ( joxi.ru/Vrw8O87IKvoydm ), такую же ссылку, как и в блоке вверху справа ( joxi.ru/RmzxWxJhWGvE5A )? Когда неавторизован, будет удобно сразу же логиниться, без промотки наверх. Спасибо.
Заранее благодарен.
Заранее благодарю за помощь!
не работает:(
Вот так правильно: