Примеры использования | Документация | Зона разработки
Во всех примерах используется библиотека pdoTools, которая, по моему скромному мнению, является обязательным дополнением.
1. Вывод списка ресурсов с сортировкой по количеству просмотров
[[!pdoResources?
&tpl=`article.tpl`
&loadModels=`sitestatistics`
&leftJoin=`{
"Statistics": {
"class": "PageStatistics",
"on": "modResource.id = Statistics.rid"
}
}`
&select=`{
"modResource": "*",
"Statistics": "IFNULL(SUM(views),0) as views, COUNT(DISTINCT user_key) as users"
}`
&groupby=`modResource.id`
&sortby=`views` // `users` для сортировки по посещениям
]]
Соответственно в чанке можно использовать плейсхолдеры [[+views]] и [[+users]]. Выглядеть это будет приблизительно так
2.
[[!mFilter2?
&class=`msProduct`
&element=`msProducts`
&loadModels=`sitestatistics`
&leftJoin=`{
"Statistics":{"class":"PageStatistics","on":"msProduct.id=Statistics.rid"}
}`
&select=`{
"msProduct": "*",
"Statistics": "IFNULL(SUM(views),0) as views, COUNT(DISTINCT user_key) as users"
}`
&groupby=`msProduct.id`
&sortby=`views`
]]
3. Пример вывода ресурсов, у которых referer содержит строку «google.ru», т.е. на которые заходили с гугла.
[[!pdoResources?
&parents=`0`
&tpl=`@INLINE <p>Заголовок "[[+pagetitle]]". Создан {{+createdon:date=`%d.%m.%Y`}}</p>`
&loadModels=`sitestatistics`
&where=`["modResource.id IN (SELECT DISTINCT Statistics.rid FROM `modx_stat_page_statistics` AS `Statistics` INNER JOIN `modx_stat_online_users` `StatUser` ON StatUser.
user_key = Statistics.user_key and StatUser.referer LIKE '%google.ru%')"]`
]]
4. Пример вывода недавно просмотренных страниц текущего пользователя.
[[!pdoResources?
&parents=`0`
&tpl=`@INLINE <p>[[+pagetitle]].</p>`
&loadModels=`sitestatistics`
&innerJoin=`{
"Statistics":{"class":"PageStatistics","on":"modResource.id=Statistics.rid"}
}`
&select=`DISTINCT modResource.pagetitle`
&where=`{"Statistics.user_key": "[[+sitestatistics.userKey]]"}`
&sortby=`Statistics.date`
&limit=`5`
]]
Можно ограничить периодом. Для этого нужно немного изменить условие
//1. Просмотренные пользователем ресурсы за текущий день &where=`["Statistics.user_key = '[[+sitestatistics.userKey]]' AND Statistics.date = CURDATE()"]` //2. Просмотренные пользователем ресурсы за конкретный день &where=`["Statistics.user_key = '[[+sitestatistics.userKey]]' AND Statistics.date = '2016-03-05'"]` //3. Просмотренные пользователем ресурсы за январь &where=`["Statistics.user_key = '[[+sitestatistics.userKey]]' AND Statistics.month = '2016-01'"]` //4. Просмотренные пользователем ресурсы за год &where=`["Statistics.user_key = '[[+sitestatistics.userKey]]' AND Statistics.year = 2016"]` //5. Просмотренные пользователем ресурсы за период &where=`["Statistics.user_key = '[[+sitestatistics.userKey]]' AND Statistics.date BETWEEN '2016-01-01' and '2016-03-31' "]` //6. Просмотренные пользователем ресурсы за последние 7 дней &where=`["Statistics.user_key = '[[+sitestatistics.userKey]]' AND Statistics.date >= DATE_SUB(CURDATE(),INTERVAL 7 DAY)"]`
5. Вывод статистики по пользователям за указанный период
[[!pdoUsers?
&tpl=`@INLINE <p>[[+username]] - [[+views]].</p>`
&loadModels=`sitestatistics`
&innerJoin=`{
"UserStat":{"class":"UserStatistics","on":"modUser.
id=UserStat.uid"},
"PageStat":{"class":"PageStatistics","on":"UserStat.user_key=PageStat.user_key"}
}`
&select=`{
"PageStat": "SUM(PageStat.views) as views"
}`
&groupby=`UserStat.uid`
&where=`["PageStat.date BETWEEN '2016-01-01' and '2016-01-31'"]`
]]
Если нужно вывести статистику только для текущего пользователя, то указываем его в where
&where=`["UserStat.uid = [[+modx.user.id]] AND PageStat.date BETWEEN '2016-01-01' and '2016-01-31'"]`
pdoResources — сниппет пакета pdoTools
pdoResources — Сниппет предназначен для вывода ресурсов по заданным параметрам.
Оглавление
pdoResources — сниппет предназначен для вывода списка ресурсов. Является продвинутой заменой для getResources: обладает всеми его возможностями, но лишен недостатков.
Умеет правильно сортировать ТВ параметры, присоединять таблицы при выборке, включать и исключать категории из разных контекстов и еще много чего.
Параметры
Параметры сниппета pdoResources.
Параметры выборки ресурсов
Эти параметры определяют, какие ресурсы появятся в генерируемом списке.
| &parents | Текущий ресурс | Список родителей, через запятую, для поиска результатов. Если поставить 0 — выборка не ограничивается. Если id родителя начинается с дефиса, он и его потомки исключаются из выборки. |
| &depth | 10 | Глубина поиска дочерних ресурсов от родителя. |
| &resources | Список ресурсов, через запятую, для вывода в результатах. Если id ресурса начинается с дефиса, этот ресурс исключается из выборки. | |
| &context | Ограничение выборки по контексту ресурсов. | |
| &where | Массив дополнительных параметров выборки, закодированный в JSON. | |
| &showHidden | 1 | Показывать ресурсы, скрытые в меню.![]() |
| &showUnpublished | 0 | Показывать неопубликованные ресурсы. |
| &showDeleted | 0 | Показывать удалённые ресурсы. |
| &hideContainers | 0 | Отключает вывод контейнеров, то есть, ресурсов с «isfolder = 1». |
| &select | 0 | Список полей для выборки, через запятую. Можно указывать JSON строку с массивом, например {"modResource":"id,pagetitle,content"}. |
| &sortby | pagetitle | Любое поле ресурса для сортировки, включая ТВ параметр, если он указан в параметре &includeTVs. Можно указывать JSON строку с массивом нескольких полей, например {"tvname":"ASC", "pagetitle":"DESC"}. Для случайно сортировки укажите «RAND ()» |
| &sortdir | DESC | Направление сортировки: по убыванию или возрастанию.![]() |
| &setTotal | 0 | Отключение выборки total по умолчанию (с версии 2.11.0). Сниппет pdoPage включает его всегда. |
| &limit | 10 | Ограничение количества результатов выборки. Можно использовать «0». |
| &offset | 0 | Пропуск результатов от начала. Необходимо использовать вместе с явно указанным &limit. |
| &first | 1 | Номер первой итерации вывода результатов. |
| &last | Автоматически, по формуле (total + first — 1) | Номер последней итерации вывода результатов. |
| &loadModels | Список компонентов, через запятую, чьи модели нужно загрузить для построения запроса. Например: &loadModels=`ms2gallery, msearch3`. | |
| &tvFilters | Список фильтров по ТВ, с разделителями AND и OR. Разделитель, указанный в параметре &tvFiltersOrDelimiter | |
| &tvFiltersAndDelimiter | »,» | Разделитель для условий AND в параметре &tvFilters. |
| &tvFiltersOrDelimiter | «||» | Разделитель для условий OR в параметре &tvFilters. tplFirst |
| Название | По умолчанию | Описание |
Параметры шаблонов
Эти параметры устанавливают чанки, которые содержат шаблоны для генерации вывода, то есть отвечают за внешний вид.
| Название | Описание |
| &returnIds | Установите значение «1», чтобы вернуть строку со списком id ресурсов, вместо оформленных результатов. Все указанные шаблоны игнорируются. |
| &tpl | Имя чанка для оформления ресурса. Если не указан, то содержимое полей ресурса будет распечатано на экран. |
| &tplFirst | Имя чанка для первого ресурса в результатах. |
| &tplLast | Имя чанка для последнего ресурса в результатах. |
| Имя чанка для каждого второго ресурса. | |
| &tplWrapper | Чанк-обёртка, для заворачивания всех результатов. Понимает один плейсхолдер: [[+output]]. Не работает вместе с параметром &toSeparatePlaceholders. |
| &wrapIfEmpty | Включает вывод чанка-обертки &tplWrapper даже если результатов нет. |
| &tplCondition | Поле ресурса, из которого будет получено значение для выбора чанка по условию в &conditionalTpls. |
| &tplOperator | Необязательный оператор для проведения сравнения поля ресурса в &tplCondition с массивом значений и чанков в &conditionalTpls. |
| &conditionalTpls | JSON строка с массивом, у которого в ключах указано то, с чем будет сравниваться &tplCondition, а в значениях — чанки, которые будут использованы для вывода, если сравнение будет успешно. Оператор сравнения указывается в &tplOperator. Для операторов типа isempty можно использовать массив без ключей. |
| &outputSeparator | Необязательная строка для разделения результатов работы. |
Параметры результатов
Эти параметры дополнительно определяют, какие данные и каким способом будут выводиться.
| Название | По умолчанию | Описание |
| &fastMode | 0 | Быстрый режим обработки чанков. Все необработанные теги (условия, сниппеты и т. п.) будут вырезаны. |
| &idx | Вы можете указать стартовый номер итерации вывода результатов. | |
| &totalVar | total | Имя плейсхолдера для сохранения общего количества результатов. Параметр &setTotal должен быть включен. |
| &includeContent | 0 | Включаем поле «content» в выборку.![]() |
| &includeTVs | Список ТВ параметров для выборки, через запятую. Например: «action, time» дадут плейсхолдеры [[+tv.action]] и [[tv.time]]. | |
| &prepareTVs | «1», что означает подготовку всех ТВ, указанных в &includeTVs | Список ТВ параметров, которые нужно подготовить перед выводом. |
| &processTVs | Список ТВ параметров, которые нужно обработать перед выводом. Если установить в «1», будут обработаны все ТВ, указанные в &includeTVs. | |
| &tvPrefix | tv. | Префикс для ТВ параметров. |
| &useWeblinkUrl | Генерировать ссылку с учетом класса ресурса, включает плейсхолдер [[+link]]. | |
| &toPlaceholder | Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран.![]() | |
| &toSeparatePlaceholders | Если вы укажете слово в этом параметре, то ВСЕ результаты будут выставлены в разные плейсхолдеры, начинающиеся с этого слова и заканчивающиеся порядковым номером строки, от нуля. Например, указав в параметре «myPl», вы получите плейсхолдеры [[+myPl0]], [[+myPl1]] и т. д. | |
| &showLog | 0 | Показывать дополнительную информацию о работе сниппета. Только для авторизованных в контекте «mgr». |
Примеры
Простейший вывод списка дочерних ресурсов документа с идентификатором 1:
/* modParser */
[[pdoResources?
&parents=`1`
&depth=`0`
&tpl=`ListRowTpl`
]]
/* pdoParser */
{$_modx->runSnippet('!pdoResources', [
'parents' => 1,
'depth' => 0,
'tpl' => 'ListRowTpl',
])}Если используется дополнительное поле image, то вызов изменится следующим образом:
/* modParser */
[[pdoResources?
&parents=`1`
&depth=`0`
&tpl=`ListRowTpl`
&includeTVs=`image`
]]
/* pdoParser */
{$_modx->runSnippet('!pdoResources', [
'parents' => 1,
'depth' => 0,
'tpl' => 'ListRowTpl',
'includeTVs' => 'image',
])}В чанке ListRowTpl за это поле будет отвечать плейсхолдер [[+tv..
image]]
Дополнительная информация
При переносе чанков с getResources, довольно распространённой ошибкой является использование модификатора strtotime, для форматирования даты.
Дело в том, что даты ресурсов и так хранятся в виде timestamp, но конвертируются в нормальные даты из-за использования объектов modResource — так запрограммировано в его свойствах. А потом, для форматирования даты, их нужно перевести обратно в timestamp. Выходит двойная ненужная конвертация.
pdoTools же работает напрямую с базой данных, без создания объектов и конвертации их значений, поэтому в чанк приходит timestamp, который не нужно дополнительно обрабатывать. Вы можете сразу применять модификатор date к значениям:
[[+publishedon:date=`%d.%m.%Y`]]
или
[[+createdon:date=`%Y-%m-%d`]]
Это касается работы с датами ресурсов и в других сниппетах pdoTools.
Благодарность автору
Если по какой-либо причине вы хотите поблагодарить автора данного ресурса, вы можете это сделать одним из
удобных для вас способов ниже.
- ЮMoney (Яндекс.Деньги)
Один из самых популярных способов поблагодарить автора, воспользоваться сервисом Яндекс.Деньги.
Время работы: 0,1279 s
Время запросов: 0,1279 s
Количество запросов: 27
Источник: cache
Авторская документация по web-разработке Web in Mind | © 2019 – 2023
Что такое pdoTools? (Часть 1)
После создания новой установки MODX следующим шагом часто является установка ряда дополнений для добавления функциональности сайту.
Обычный набор известен:
- getResources для списка ваших документов
- getPage для нумерации ваших списков
- Wayfinder для меню сборки
- Панировочные сухари для панировочных сухарей
- GoogleКарта сайта для карты сайта
Но можно заменить их все одним пакетом: pdoTools!
Начнем с того, что может сделать pdoTools.
9 фрагментов
Да, я серьезно. pdoTools содержит 9 сниппетов, которые могут выполнять практически любую функциональность обычного веб-сайта. И почти все они являются заменой другим популярным сниппетам.
pdoResources
pdoResources заменяет getResources.
Как и все другие сниппеты в pdoTools, он не использует объекты xPDO для представления ресурсов. Он работает напрямую с таблицами базы данных. Это делает его быстрее.
Вам не нужно преобразовывать даты ресурсов в метки времени, прежде чем вы сможете передать их в выходной фильтр «дата». И он объединяет только нужные телевизоры, поэтому вы должны указать их в свойстве &includeTVs в виде списка, разделенного запятыми.
[[pdoResources?
&родители=`0`
&includeTVs=`my_tv1,my_tv2`
&tvPrefix=`tv.`
&processTVs=`1`
&includeContent=`1`
&showLog=`1`
]] Одной из наиболее важных функций pdoTools является &showLog свойство. Это позволяет вам проверить, насколько быстрым является фрагмент.
Это медленный SQL-запрос или слишком сложный фрагмент? Свойство &showLog поможет вам разобраться.
Второй важной особенностью являются соединения SQL. С помощью pdoResources вы можете создавать сложные запросы и выбирать только то, что вам нужно.
[[!pdoResources?
&родители=`0`
&class=`modResource`
&leftJoin=`{
"Родитель": {
"класс": "модРесурс",
"on": "modResource.parent = Parent.id"
},
"Сделано": {
"класс": "modUserProfile",
"on": "modResource.createdby = CreatedBy.internalKey"
}
}`
&выбрать=`{
"modResource": "modResource.id, modResource.pagetitle",
"Родитель": "Parent.pagetitle как родитель",
"CreatedBy": "CreatedBy.fullname как автор"
}`
&showLog=`1`
]] В приведенном выше примере вам не нужно вызывать какие-либо фрагменты или выходные фильтры, чтобы получить родителя ресурса или имя создателя. Как быстро это работает? Давайте посмотрим на вывод журнала.
.
Есть много других интересных функций, но эти самые важные.
pdoPage
pdoPage является заменой getPage. Есть несколько отличий от getPage:
- Он не показывает пустые страницы. Если у вас нет результатов на странице, или пользователь ввел не ту страницу вручную — вы будете перенаправлены на первую страницу.
- Имеет свойство
&maxLimit, для которого по умолчанию установлено значение 100. Это гарантирует, что пользователи не смогут замедлить работу вашего сайта, установив&limit=100000в URL-адресе. Если вы используете getPage — просто попробуйте сделать это на своем сайте. - Устанавливает метатеги на предыдущую и следующую страницы для поисковых роботов в заголовке страницы.
- Имеет встроенную пагинацию ajax. Вот как это работает:
<дел>
<дел>
[[!pdoPage?
&родители=`0`
&ajaxMode=`по умолчанию`
]]

user_key = Statistics.user_key and StatUser.referer LIKE '%google.ru%')"]`
]]

id=UserStat.uid"},
"PageStat":{"class":"PageStatistics","on":"UserStat.user_key=PageStat.user_key"}
}`
&select=`{
"PageStat": "SUM(PageStat.views) as views"
}`
&groupby=`UserStat.uid`
&where=`["PageStat.date BETWEEN '2016-01-01' and '2016-01-31'"]`
]]


Разделитель, указанный в параметре &tvFiltersOrDelimiter
tplFirst
Понимает один плейсхолдер:
Для операторов типа isempty можно использовать массив без ключей.


Вы можете увидеть их все, если просто установите пустой параметр 
В следующих двух статьях я расскажу о скорости и о pdoParser.
Вы можете делать с ним интересные вещи, такие как «умные» страницы 404. Это может быть действительно подходящим для вашего варианта использования. Опять же, может и нет.
д….» Подробнее об этом здесь.
Это сработало, но подход имел ограничения и был немного неуклюжим. Конечно, со всей этой ерундой производительность могла бы улучшиться.