pdoParser. Pdotools modx revo
pdoMenu / Сниппеты / pdoTools / docs.modx.pro
- Параметры
- Примеры
Сниппет генерации меню. Может заменять Wayfinder, и позволяет более гибко указывать параметры.
Например, умеет строить меню сразу из нескольких родителей, отображая их как вместе, так и отдельными ветками.
Существенный прирост скорости дает только при первом запуске, дальше Wayfinder не особо уступает, благодаря грамотному кэшированию.
Параметры
&parents | Текущий ресурс | Список родителей, через запятую, для поиска результатов. Если поставить 0 - выборка не ограничивается. Если id родителя начинается с дефиса, он и его потомки исключаются из выборки. |
&level | 0 (не ограниченно) | Уровень генерируемого меню. |
&resources | Список ресурсов, через запятую, для вывода в результатах. Если id ресурса начинается с дефиса, этот ресурс исключается из выборки. | |
&templates | Список шаблонов, через запятую, для фильтрации результатов. Если id шаблона начинается с дефиса, ресурсы с ним исключается из выборки. | |
&where | Массив дополнительных параметров выборки, закодированный в JSON. | |
&displayStart | 0 | Включить показ начальных узлов меню. Полезно при указании более одного «parents». |
&context | Ограничение выборки по контексту ресурсов. | |
&showHidden | 0 | Показывать ресурсы, скрытые в меню. |
&showUnpublished | 0 | Показывать неопубликованные ресурсы. |
&previewUnpublished | 0 | Включить показ неопубликованных документов, если у пользователя есть на это разрешение. |
&hideSubMenus | 0 | Спрятать неактивные ветки меню. |
&select | Список полей для выборки, через запятую. Можно указывать JSON строку с массивом, например {"modResource":"id,pagetitle,content"}. | |
&sortby | menuindex | Любое поле ресурса для сортировки, включая ТВ параметр, если он указан в параметре &includeTVs, например {"tvname":"ASC", "pagetitle":"DESC"}. Можно указывать JSON строку с массивом нескольких полей. Для случайно сортировки укажите «RAND()» |
&sortdir | ASC | Направление сортировки: по убыванию или возрастанию. Если оставить параметры &sortby и &sortdir пустыми, то сортировка будет идти по порядку ресурсов в &resources. |
&limit | 0 | Ограничение количества результатов выборки. Можно использовать «0». |
&offset | 0 | Пропуск результатов от начала. Необходимо использовать вместе с явно указанным &limit |
&checkPermissions | Укажите, какие разрешения нужно проверять у пользователя при выводе документов. Например &checkPermissions=`list`. | |
&countChildren | 0 | Точный подсчет количества дочерних ресурсов каждой категории и вывод их в плейсхолдер [[+children]]. Делает дополнительные запросы в БД, поэтому по умолчанию отключен. |
&toPlaceholder | Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем вместо вывода на экран. | |
&plPrefix | wf. | Префикс для выставляемых плейсхолдеров |
&showLog | 0 | Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контекcте «mgr». |
&fastMode | 0 | Быстрый режим обработки чанков. Все необработанные теги (условия, сниппеты и т.п.) будут вырезаны. |
&cache | 0 | Кэширование результатов работы сниппета. |
&cacheTime | 3600 | Время актуальности кэша, в секундах. |
&scheme | -1 | Схема формирования url, передаётся в modX::makeUrl(), поэтому возможные варианты нужно смотреть здесь. Особый тип uri подставляет значение uri ресурса, без запуска функции. |
&useWeblinkUrl | 1 | Генерировать ссылку с учетом класса ресурса. |
&rowIdPrefix | Префикс для выставления идентификатора в чанк. | |
&hereId | Id документа, текущего для генерируемого меню. Нужно указывать только если скрипт сам его неверно определяет, например при выводе меню из чанка другого сниппета. | |
&includeTVs | Список ТВ параметров для выборки, через запятую. Например: «action,time» дадут плейсхолдеры [[+action]] и [[+time]]. | |
&tvPrefix | Префикс для ТВ параметров. |
Параметры шаблонов
Эти параметры устанавливают чанки, которые содержат шаблоны для генерации меню.
&tplOuter | Чанк обертка всего блока меню. По умолчанию: @INLINE <ul[[+classes]]>[[+wrapper]]</ul> |
&tpl | Имя чанка для оформления ресурса. Если не указан, то содержимое полей ресурса будет распечатано на экран. По умолчанию: @INLINE <li[[+classes]]><a href="[[+link]]" [[+attributes]]>[[+menutitle]]</a>[[+wrapper]]</li> |
&tplParentRow | Чанк оформления контейнера с потомками |
&tplParentRowHere | Чанк оформления текущей категории |
&tplHere | Чанк текущего документа |
&tplInner | Чанк обертки внутренних пунктов меню. Если пуст - будет использовать &tplOuter |
&tplInnerRow | Чанк обертка внутреннего пункта меню |
&tplInnerHere | Чанк обертка активного пункта меню |
&tplParentRowActive | Чанк оформления активной категории |
&tplCategoryFolder | Специальный чанк оформления категории. Категория - это документ с «isfolder = 1» и или нулевым шаблоном, или с атрибутом "rel=category" |
&tplStart | Чанк оформления корневого пункта, при условии, что включен &displayStart. По умолчанию: @INLINE <h3[[+classes]]>[[+menutitle]]</h3>[[+wrapper]] |
Параметры CSS классов
Эти параметры задают значение плейсхолдера [[+classes]] для различных элементов меню.
&firstClass | Класс для первого пункта меню. По умолчанию: first |
&lastClass | Класс последнего пункта меню. По умолчанию: last |
&hereClass | Класс для активного пункта меню. По умолчанию: active |
&parentClass | Класс категории меню. |
&rowClass | Класс одной строки меню. |
&outerClass | Класс обертки меню. |
&innerClass | Класс внутренних ссылок меню. |
&levelClass | Класс уровня меню. Например, если укажите «level», то будет «level1», «level2» и т.д. |
&selfClass | Класс текущего документа в меню. |
&webLinkClass | Класс документа-ссылки. |
Примеры
Обычный вывод меню из корня сайта в один уровень:
[[pdoMenu? &parents=`0` &level=`1` ]]Вывод с исключением определенных родителей и проверкой разрешений пользователя:
[[pdoMenu? &parents=`-10,-15` &level=`2` &checkPermissions=`load,list,view` ]]Вывод меню сразу из двух родителей, с показом корневых точек:
[[pdoMenu? &parents=`10,15` &displayStart=`1` ]]Вывод двух уровней документов с подсчетом количества вложенных ресурсов:
[[pdoMenu? &parents=`0` &level=`2` &tplInner=`@INLINE [[+wrapper]]` &tplParentRow=`@INLINE <li[[+classes]]><a href="[[+link]]" [[+attributes]]>[[+menutitle]]</a> ([[+children]])</li>[[+wrapper]]` &countChildren=`1` ]]pdoParser / Классы / pdoTools / docs.modx.pro
pdoParser является заменой класса modParser.
Обработка плейсхолдеров
Его задача - стараться быстро разобрать теги MODX без создания объектов, как это делает оригинальный парсер. pdoParser умеет работать только с простыми тегами, без фильтров и условий, то есть:
- [[%tag]] - строка лексикона
- [[~id]] - ссылка
- [[+tag]] - обычные плейсхолдеры
- [[++tag]] - системные плейсхолдеры
- [[*tag]] - плейсхолдеры ресурса
- [[#tag]] - плейсхолдеры FastField
Специальные теги FastField были предложены Виталием Киреевым в одноимённом дополнении. После согласованию с автором, pdoParser был обучен работе с ними.
Он умеет:
- Выводить поля ресурсов: [[#15.pagetitle]], [[#20.content]]
- Выводить ТВ параметры ресурсов: [[#15.date]], [[#20.some_tv]]
- Выводить поля товаров miniShop2: [[#21.price]], [[#22.article]]
- Выводить массивы ресурсов и товаров: [[#12.properties.somefield]], [[#15.size.1]]
- Выводить глобальные массивы: [[#POST.key]], [[#SESSION.another_key]]
- Распечатывать массивы для отладки: [[#15.colors]], [[#GET]], [[#12.properties]]
Цифра после решетки - это id ресурса, от которого нужно выбрать данные.
Все эти теги pdoTools обрабатывает без создания объектов modElement, поэтому работает немного быстрее чем родные методы MODX. Если же плейсхолдер вызван с какими-то параметрами, то он уйдёт в родной modParser.
Шаблонизатор Fenom
С версии 2.0 в состав pdoTools входит шаблонизатор Fenom (анонс от автора на Хабре).
Работает только при включенном pdoParser и если разрешен в системных параметрах.
Возможности
- Компилируется в нативный PHP код, который выполняется гораздо быстрее, чем теги MODX. Прирост, в среднем 30% - 50%.
- Может работать и в чанках и на страницах сайта
- Теги Fenom и MODX никак не мешают друг другу и работают одновременно
- Если в чанке нет плейсхолдеров MODX, то парсер MODX не запускается
- Если в чанке нет тегов Fenom, то он тоже не запускается
- Поддерживаются даже @INLINE чанки
- В отличии от других решений, вам не нужно никаким образом менять или переписывать свои сниппеты - всё работает через методы pdoTools::getChunk() и pdoTools::parseChunk() автоматически.
- Все ошибки компиляции пишутся в системный журнал
Настройки
- 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`, так что каждый может проверить сам.
Примеры
Стандартный чанк tpl.Tickets.comments.wrapper из компонента Tickets
<div> [[+modx.user.id:isloggedin:is=`1`:then=` <span> <label for="comments-subscribe"> <input type="checkbox" name="" value="1" [[+subscribed:notempty=`checked`]] /> [[%ticket_comment_notify]] </label> </span> `:else=``]] <h5>[[%comments]] (<span>[[+total]]</span>)</h5> <div> <ol>[[+comments]]</ol> </div> <div> <div></div> <div></div> </div> </div>Он же, переписанный для работы с Fenom
<div> {if $modx->user->isAuthenticated($modx->context->key)} <span> <label for="comments-subscribe"> <input type="checkbox" name="" value="1" {$subscribed != '' ? 'checked' : ''} /> {$modx->lexicon('ticket_comment_notify')} </label> </span> {/if} <h5>{$modx->lexicon('comments')} (<span>{$total}</span>)</h5> <div> <ol>{$comments}</ol> </div> <div> <div></div> <div></div> </div> </div>docs.modx.pro
pdoNeighbors / Сниппеты / pdoTools / docs.modx.pro
- Параметры
- Примеры
Сниппет pdoNeighbors выводит предыдущие и следующие документы от указанного.
Умеет выводить по несколько соседей сразу, проверяет их статус (удалён, опубликован) и позволяет указать сортировку.
Вы можете выводить предыдущие/следующие документы по «menuindex», дате публикации или другому полю ресурса.
Параметры
Принимает все параметры pdoTools (за исключением чанков-шаблонов) и некоторые свои:
&id | Текущий документ | Идентификатор ресурса, относительно которого выводятся соседи. |
&tplPrev | см. ниже | Чанк ссылки на предыдущий документ. |
&tplUp | см. ниже | Чанк ссылки на родительский документ. |
&tplNext | см. ниже | Чанк ссылки на следующий документ. |
&tplWrapper | см. ниже | Чанк-обёртка, для заворачивания результатов. Понимает плейсхолдеры: [[+left]], [[+top]], [[+right]] и [[+log]]. Не работает вместе с параметром &toSeparatePlaceholders. |
&toPlaceholder | Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран. | |
&showLog | 0 | Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контекте «mgr». |
Шаблоны
&tplPrev | @INLINE <span><a href="/[[+uri]]">← [[+menutitle]]</a></span> |
&tplUp | @INLINE <span>↑ <a href="/[[+uri]]">[[+menutitle]]</a></span> |
&tplNext | @INLINE <span><a href="/[[+uri]]">[[+menutitle]] →</a></span> |
&tplWrapper | @INLINE <div>[[+prev]][[+up]][[+next]]</div> |
Примеры
По умолчанию сниппет выводит соседей, как они есть в дереве ресурсов, то есть, ориентируется на «menuindex»:
[[pdoNeighbors]]По умолчанию, соседи выбираются от текущего документа, но можно указать и другой id:
[[pdoNeighbors? &id=`55` ]]Сниппет отлично подходит для вывода ссылок на соседние новости (их лучше сортировать по дате публикации):
[[pdoNeighbors? &sortby=`publishedon` &sortdir=`asc` ]]docs.modx.pro
pdoUsers / Сниппеты / pdoTools / docs.modx.pro
Сниппет для вывода пользователей сайта через pdoTools.
Формирует список пользователей сайта с учетом групп и ролей.
Параметры
Использует все общие параметры pdoTools за исключением специфичных для класса modResource, а так же свои собственные:
&groups | Список групп пользователей, через запятую. Можно использовать имена и id. Если значение начинается с минуса (-), значит пользователь не должен присутствовать в этой группе. | |
&roles | Список ролей пользователей, через запятую. Можно использовать имена и id. Если значение начинается с минуса (-), значит такой роли у пользователя быть не должно. | |
&users | Список пользователей для вывода, через запятую. Можно использовать поля username и id. Если значение начинается с минуса (-), этот пользователь исключается из выборки. | |
&showInactive | 0 | Выводить в том числе и неактивных пользователей |
&showBlocked | 0 | Выводить в том числе и блокированных пользователей |
&returnIds | Установите значение «1», чтобы вернуть строку со списком id ресурсов, вместо оформленных результатов. Все указанные шаблоны игнорируются. | |
&showLog | 0 | Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контекте «mgr». |
&toPlaceholder | Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран. | |
&wrapIfEmpty | Включает вывод чанка-обертки &tplWrapper, даже если результатов нет. | |
&tplWrapper | Чанк-обёртка, для заворачивания всех результатов. Понимает один плейсхолдер: [[+output]]. Не работает вместе с параметром &toSeparatePlaceholders. |
Переопределенные параметры pdoTools
&class | modUser | Класс пользователя |
&sortby | modUser.id | Любое поле пользователя для сортировки. Можно указывать JSON строку с массивом нескольких полей. Для случайно сортировки укажите «RAND()» |
&sortdir | ASC | Направление сортировки: по убыванию «DESC» или возрастанию «ASC». |
Все шаблоны по умолчанию пусты. Для вывода результата в виде HTML, нужно указать, как минимум, значение шаблона &tpl.
Примеры
При запуске без параметров, сниппет выводит всех пользователей сайта.
[[!pdoUsers]]Вывод пользователей группы Authors:
[[!pdoUsers? &groups=`Authors` &tpl=`tpl.Authors.author` &sortdir=`asc` ]]Можно комбинировать его с pdoPage\getPage:
[[!pdoPage? &element=`pdoUsers` &groups=`Authors` &tpl=`tpl.Authors.author` &sortdir=`asc` ]]Встроенные чанки:
[[!pdoUsers? &roles=`Member` &tpl=`@INLINE <p>Имя - [[+fullname]], ID - [[+id]]</p>` &sortby=`id` &sortdir=`asc` ]]Демо
Вывод авторов и друзей репозитория Simple Dream.
docs.modx.pro