[pdoTools] Версия 2.1 - улучшения Fenom
Привет друзья! Хочу представить вам новую версию pdoTools с улучшениями работы шаблонизатора Fenom.
С другой стороны, я не хочу придумывать очередной псевдоязык команд, типа
Немного примеров:
В отличии от {$modx}, {$_modx} доступен всегда, во все чанках и не зависит от системных настроек. Он просто добавяляет нужные фукнции от MODX шаблонизатору, чтобы можно было выводить данные текущего юзера или ресурса.
Есть еще одна подобная служебная переменная (просто напоминаю) — {$_pls}, в ней вы можете найти все значения, переданные в чанк сниппетом.
Теперь вы можете делать в своих чанках и шаблонах вот так:
Включаем системную настройку pdotools_fenom_parser и пишем новый шаблон Fenom Base:
Пишем второй шаблон Fenom Extended:
Теперь проверяем один и тот же ресурс, назначая ему эти шаблоны по очереди:
Теперь вы можете написать один базовый шаблон и расширить его дочерними. Точно также можно писать и расширять чанки, только обратите внимание, что для работы с modTemplate нужно указывать префикс template:, а для чанков нет — они работают по умолчанию во всех include и extends.
Более подробно работу с Fenom я освещал на последнем платном курсе занятий, так что повторяться не буду.
Теперь вы можете писать довольно продвинутые чанки и шаблоны на своих сайтах, используя не только более удобный синтаксис, но и философию наследования и расширения.
Обновляемся, тестируем, пишем о багах. Не забудьте обновить и редактор Ace, чтобы появилась подсветка синтаксиса Fenom!

Некэшированный вызов, понятно дело, вот такой:
Также добавил поддержку наборов параметров:
И pdoParser, наконец-то, больше не считается экспериментальным и включен по умолчанию.
Функциональность vs Безопасность
Я долго думал, как бы разрешить менеджерам запускать чанки и сниппеты, но при этом не пускать их к объектам MODX. Потому что, если включить системную настройку pdotools_fenom_modx, то любой менеджер сможет сделать в чанке вот так:{if $res = $modx->getObject('modResource', 1)}
$res->remove();
{/if}Нам бы этого не хотелось, правда?С другой стороны, я не хочу придумывать очередной псевдоязык команд, типа
{runSnippet('name', [params => data])}или{'name' [params => data] | snippet}Поэтому я добавил специальную переменную {$_modx}, которая ссылается на небольшой безопасный класс, где есть только нужные менеджерам функции и свойства:- {$_modx->placeholders} — массив с системными плейсхолдерами
- {$_modx->config} — массив с системными настройками
- {$_modx->context} — массив (не объект!) с текущим контекстом
- {$_modx->user} — массив (не объект!) с текущим пользователем
- {$_modx->resource} — массив (не объект!) с текущим ресурсом
- {$_modx->lexicon} — служба загрузки лексиконов
- {$_modx->lexicon()} — функция для вывода строки из лексикона
- {$_modx->runSnippet()} — запуск сниппета
- {$_modx->runProcessor()} — запуск процессора
- {$_modx->getChunk()} — вывод чанка
- и т.д., смотрите исходник.
Немного примеров:
{$_modx->runSnippet('pdoMenu', [
'parents' => 0,
'level' => 2
])}
<p>
{$_modx->lexicon->load('ms2gallery:default')}
Проверка словарей ms2Gallery: {$_modx->lexicon('ms2gallery_err_gallery_exists')}
</p>
<p>
{if $_modx->isAuthenticated('web')}
Привет, {$_modx->user.fullname}!
{else}
Вам нужно авторизоваться =(
{/if}
</p>
<p>Текущий контекст: {$_modx->context.key}</p>
Таким образом, теперь можно использовать основные функции MODX из Fenom безопасно, не давая доступ к ядру сайта менеджерам и не рискуя удалением объектов из чанков.В отличии от {$modx}, {$_modx} доступен всегда, во все чанках и не зависит от системных настроек. Он просто добавяляет нужные фукнции от MODX шаблонизатору, чтобы можно было выводить данные текущего юзера или ресурса.
Есть еще одна подобная служебная переменная (просто напоминаю) — {$_pls}, в ней вы можете найти все значения, переданные в чанк сниппетом.
Расширение шаблонов
Второе большое изменение — внедрение собственного провайдера шаблонов в Fenom, чтобы он научился самостоятельно загружать и использовать чанки MODX.Теперь вы можете делать в своих чанках и шаблонах вот так:
{include 'имя чанка'}
или
{include 'template:имя шаблона'}Подробнее про include в документации автора, но лично мне было интереснее, чтобы заработал extends.Включаем системную настройку pdotools_fenom_parser и пишем новый шаблон Fenom Base:
<!DOCTYPE html>
<html lang="en">
<head>
{include 'head'}
</head>
<body>
{block 'navbar'}
{include 'navbar'}
{/block}
<div class="container">
<div class="row">
<div class="col-md-10">
{block 'content'}
{$_modx->resource.content}
{/block}
</div>
<div class="col-md-2">
{block 'sidebar'}
Sidebar
{/block}
</div>
</div>
{block 'footer'}
{include 'footer'}
{/block}
</div>
</body>
</html>Как видите, он включает обычные чанки (в которых, кстати, обычные плейсхолдеры MODX от Theme.Bootstrap) и определяет несколько блоков (block), которые можно расширить в другом шаблоне!Пишем второй шаблон Fenom Extended:
{extends 'template:Fenom Base'}
{block 'content'}
<h3>{$_modx->resource.pagetitle}</h3>
<div class="jumbotron">
{parent}
</div>
{/block}Здесь происходит расширение базового шаблона — меняется блок с контентом страницы.Теперь проверяем один и тот же ресурс, назначая ему эти шаблоны по очереди:
Теперь вы можете написать один базовый шаблон и расширить его дочерними. Точно также можно писать и расширять чанки, только обратите внимание, что для работы с modTemplate нужно указывать префикс template:, а для чанков нет — они работают по умолчанию во всех include и extends.
Более подробно работу с Fenom я освещал на последнем платном курсе занятий, так что повторяться не буду.
Заключение
Пока англоязычное сообщество спорит, каким должен быть MODX 3, мы продолжаем работать с MODX 2.3 и наращивать его функционал дополнениями.Теперь вы можете писать довольно продвинутые чанки и шаблоны на своих сайтах, используя не только более удобный синтаксис, но и философию наследования и расширения.
Обновляемся, тестируем, пишем о багах. Не забудьте обновить и редактор Ace, чтобы появилась подсветка синтаксиса Fenom!

Обновление от 12.08.2015
С версии 2.1.1-pl, все обычные вызовы сниппетов становятся кэшированными:{$_modx->runSnippet('pdoResources')}Некэшированный вызов, понятно дело, вот такой:
{$_modx->runSnippet('!pdoResources')}Также добавил поддержку наборов параметров:
{$_modx->getChunk('Name@PropertySet')}
{$_modx->runSnippet('NameName@PropertySet')}
{include 'Name@PropertySet'}
{include 'template:TemplateName@PropertySet'}Если набор параметров не указан, то чанкам и шаблонам подгружается «умолчательный».И pdoParser, наконец-то, больше не считается экспериментальным и включен по умолчанию.
Комментарии: 74
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.


Если обновиться — сломается?
До обновления работали такие конструкции.
Сейчас же всю страницу ломает.
Пишу Не работает.
В логе пишет:
А чуть ниже пример вызова.
Пока что можно передавать свои переменные прямо при вызове include — смотри документацию Fenom.
в чанке, который вызывается через инклюд
из-за строчки &where=`{«isfolder»:1}` все крашится
Документацию к Fenom хоть почитай, что ли.
Ну а так, автор Fenom предусмотрел тег ignore и пропуск выражений типа { expr } — то есть, с пробелами возле скобок.
С одной стороны — нужно самому управлять кэшем, а с другой стороны — можно произвольно задавать параметры кэширования: ключ, время кэширования (в примере полчаса) и т.д.
Посмотреть этот кэш можно в /core/cache/default/.
при выставлении кэша нужно, чтобы не выводилась 1 при успешной работе $_modx->cacheManager->set.
С версии 2.1.1-pl, все обычные вызовы сниппетов становятся кэшированными:
Некэшированный вызов, понятно дело, вот такой:
Можно обновляться.
Если очень хочется самому управлять кэшем — то верхний пример по-прежнему работает.
Спасибо за нововведения, Василий!
Это привнесёт поддержку не только Fenom, но и еще тысяч других классов и шаблонизаторов.
Как быть если необходимо кэширование ресурсов?
Причем. На некоторых страницах некэшированный вызов {$_modx->runSnippet('MinifyX' отрабатывает нормально.
Вопрос не конкретно к Павлу, а ко всем.
а сам вызов:
Этот вызов не виноват, где-то у тебя там еще есть {id:, что похоже на тег Fenom, но им не является. Ищи и экранируй.
Но теперь по сути этого вызова появились аналогичные
Пхп у меня как раз 5.3 и я так думаю квадратными скобками я не смогу воспользоваться
Если ты решил, что здесь чистый синтаксис PHP, то ты не прав — это синтаксис Fenom и указание массивов как ['key' => 'value'] не требует PHP 5.4
Немного сумасшедший эксперимент провожу, хочу перевести все чанки и шаблоны на файлы.
Файл my_chunk.tpl должен лежать в MODX_ASSETS_PATH. 'elements/chunks/', то есть, по умолчанию, в /assets/elements/chunks/.
Дальше всё примерно так же:
{$_modx->config.site_template}, чтобы получить @FILE [[++site_template]]/my_chunk.tpl
github.com/bezumkin/pdoTools/blob/master/core/components/pdotools/model/pdotools/_micromodx.php#L143
Как использовать Fenom в чанках из-под плагина? В каком событии?
{set $relativeCategoryId = $_modx->config['some_category_id']}
Можно ли в подоьном виде использовать её потом. Или нужно будет через $_modx->runSnippet()?
[[pdoResources?
&parents=`{$relativeCategoryId}`
&tpl=`relativeCategoryItem`
]]
Василий, спасибо!
прописывал еще так в этом случае наоборот в Чанке в порядке а через AjaxSnippet не выводит.
Подскажите пожалуйста решение.
Решил попробовать fenom на своем сайте, в результате fenom работает при вызове pdoPage, но не работает на страницах и шаблонах сайта. Пытался выводить следующее:
Собственно все это он и выводит на странице как есть, без включения парсера. Настройки вроде правильные:
Версия pdoTools — 2.1.20-pl
Почитал форум, про подобные проблемы и конфликты со скобками, создал пустой шаблон и создал ресурс на этом шаблоне с тем, что писал выше и результат тот же — выводит как есть. Подозреваю, что что то с настройками.
И еще журнал ошибок проверить, может где-то правило неверное.
Да, Вы правы. До этого чистил кэш через админку, а вот удалил вручную и все заработало.
Большое спасибо.
{$_modx->runSnippet('!test')}
Код сниппета test
По задумке сниппет должен считать обновления страницы, чисто чтобы видно было, что каждое обновление — сработал некешируемый сниппет. Но сниппет кешируется и считает только если в документе убрать галко «Кэшируемый» или просто перед каждым обновлением руками обновлять кеш.
А как например мне вызвать аналог [[!*pagetitle]] т.е. не сниппет, а тег некешированным вызвать? В смарти есть такая штука {nocache}
В fenom чет ничего подобного не вижу github.com/fenom-template/fenom/blob/master/docs/ru/readme.md
Версия модх 2.4.2-pl, последняя. Версия пдотулз тоже крайняя.
Теги не кэшируются вообще, а напрямую выводятся данные из $modx->resource. Документация.
Значит, данные там в $modx->resource кешируются как-то? Занятно.
Написал второй сниппет test2 с таким содержимом
и вызвал его не кешированным.
Адекватно показывает свежее состояние description.
При этом, $modx->resource->description содержит старое значение.
Для этого и придуман параметр cacheable — сохранять данные в кэш, или нет. Многие думают, что там только кэшированные сниппеты или шаблон страницы, но нет — там все свойства объекта.
И да, кэш ресурсов очищается при их сохранении в админке, может поэтому у тебя там иногда обновляются данные.
Лично я всё это заметил, когда пытался сохранять просмотры в ресурс для Tickets. Поэтому там сейчас отдельная таблица просмотров и никаких проблем нет.
Как убрать эту часть
Если я захожу на первый страницу вставляется
Но если потом захожу на page-2, то вставляется
Никто не сталкивался с таким?