Примеры использования | Документация | Зона разработки
Во всех примерах используется библиотека 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=`["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 | Любое поле ресурса для сортировки, включая ТВ параметр, если он указан в параметре {"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 представляет логическое условие OR и по нему условия группируются в первую очередь. Внутри каждой группы вы можете задать список значений, разделив их &tvFiltersAndDelimiter. Поиск значений может проводиться в каком-то конкретном ТВ, если он указан «myTV==value», или в любом «value». Пример вызова: | |
&tvFiltersAndDelimiter | »,» | Разделитель для условий AND в параметре &tvFilters. |
&tvFiltersOrDelimiter | «||» | Разделитель для условий OR в параметре &tvFilters. tplFirst |
Название | По умолчанию | Описание |
Параметры шаблонов
Эти параметры устанавливают чанки, которые содержат шаблоны для генерации вывода, то есть отвечают за внешний вид.
Название | Описание |
&returnIds | Установите значение «1», чтобы вернуть строку со списком id ресурсов, вместо оформленных результатов. Все указанные шаблоны игнорируются. |
&tpl | Имя чанка для оформления ресурса. Если не указан, то содержимое полей ресурса будет распечатано на экран. |
&tplFirst | Имя чанка для первого ресурса в результатах. |
&tplLast | Имя чанка для последнего ресурса в результатах. |
&tplOdd | Имя чанка для каждого второго ресурса. |
&tplWrapper | Чанк-обёртка, для заворачивания всех результатов. Понимает один плейсхолдер: . Не работает вместе с параметром &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,1243 s
Время запросов: 0,1243 s
Количество запросов: 27
Источник: cache
Авторская документация по web-разработке Web in Mind | © 2019 – 2023
Быстрый старт / pdoTools / Components / docs.modx.pro
После создания новой установки MODX следующим шагом часто является установка ряда дополнений для добавления функциональности сайту.
Обычный набор известен:
- getResources для списка ваших документов
- getPage для нумерации ваших списков
- Wayfinder для меню сборки
- Панировочные сухари для панировочных сухарей
- GoogleSitemap для карты сайта
Но можно заменить их все одним пакетом: 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. С помощью pdoTools вы можете создавать сложные запросы и выбирать только то, что вам нужно.
[[!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=`по умолчанию` ]]