Categories: ModX

Как фильтровать данные tv в modx через pdoPage

На modx можно делать интересные вещи. Не зря много веб-компаний делают порталы, интернет-магазины, мощные сервисы бронирования и другие сайты. Кроме того, modx входит в ТОП бесплатных CMS.
Но что-то я далеко зашел. Одним из нужных функционалов есть фильтрацией данных по определенному критерию. И в этой статье я хочу написать вам несколько примеров как фильтровать и выводить данные на modx с помощью pdoPage, в том числе и с дополнительных полей (tv).

Выводим данные с дополнительного поля с фильтрацией where

Не забываем, что при использовании дополнительных полей в pdoPage их нужно прописать в includeTVs:

[[!pdoPage? 
&parents=`76` 
&includeTVs=`status, start, minimum` 
&where=`{"status":"Заявка"}` 
&tpl=`@INLINE
<a href="[[+uri]]">[[+pagetitle]]</a>: [[+tv.status]]; от [[+tv.start]]; минимум [[+tv.minimum]]
` 
&limit=`10` ]]

По коду:
!pdoPage = вызов сниппета, не кешируемый (знак восклицания).
parents = родительский элемент (если документы у вас в корне, то ставьте 0)
includeTVs = включает дополнительные поля для вывода
where = фильтрация запроса (в моем примере поле «статус» должно быть «Заявка»). Кстати, есть нюанс если стоит «поле по умолчанию» в настройке ввода дополнительного поля. Об этом позже.
tpl = шаблон вывода. В примере идет название статьи с активной ссылкой, дальше статус и еще два дополнительных поля.
limit = максимальное количество пунктов для вывода.

Примеры использования where в pdoPage modx revolution

Несколько примеров самого where:

&where = `{"start:>" : "10.01.2018"}`
&where=`{"minimum:>" : "100$"}`
&where = `{"status" : "Выполнено"}`
&where = `{"minimum:>=" : "1000"}`
&where = `{"status:!=" : "Архив"}`
&where = `{"minimum:!=" : "100"}`
&where=`{"pagetitle:LIKE":"%rent%", "AND:minimum:LIKE":"%$%"}`
&where=`{"pagetitle:LIKE":"%rent%", "OR:status:=":"Заявка"}`
&where=`{"minimum:=":"100$", "OR:status:=":"Оплачено"}`
&where=`{"minimum:=":"100$", "OR:status:=":"Оплачено", "OR:start:=":"20.03.2018"}`

Обратите внимание на комбинированные запросы (AND, OR). В них для значений «равно» нужно писать := . Для неизвестной части значения знаки процентов %. Запросы могут быть и длиннее. Также обращайте внимание на формат дат, особенно в Дополнительных полях с Параметров ввода Дата.

Фильтр данных в pdoMenu modx

Все примеры выше также подойдут и для pdoMenu.

[[pdoMenu?
    &parents=`76`
    &level=`1`
&includeTVs=`status, start, minimum` 
&where=`{"minimum:=":"1$", "OR:status:=":"Заявка"}`
&tpl=`sideall`
&limit=`10`
&sortdir=`DESC`
 &sortby=`publishedon`
]]

Не выводит дополнительное поле в where через pdoPage modx

Это может быть из-за того, что забыли указать includeTVs. Также я столкнулся с такой проблемой в modx revolution 2.5.7-pl, версия pdoTools 2.9.2-pl1. Не выводило данные, которые в Параметрах ввода дополнительного поля стояли По умолчанию. Хотя в некоторых других частях кода все работало. Как только я убрал данные (заменил по умолчанию на пробел) сразу все заработало.

Фильтр данных на modx с помощью pdoPage

veniamin

View Comments

  • Добрый день!

    Подскажите, как работать с pdoPage через Smarty?

    Я написал следующий код вызова сниппета pdoPage в шаблоне Smarty:

    {snippet name="pdoPage" params=[
    'limit' => 12
    ,'tpl' => {include file='tpl/item.tpl'}
    ,'parents' => $modx->resource->id
    ,'includeTVs' => 'image,price'
    ] nocache}

    Но затем в шаблоне item.tpl не могу обратиться к дополнительным полям image,price.

    Я нашел извращенный способ, но при этом типы данных становятся типа string и никак не обрабатываются в логике Smarty, например в условиях if, собственно item.tpl

    @INLINE
    {assign var=params value=[
    ,'price'      => '[[+tv.price]]'
    ,'image'      => '[[+tv.image]]'
    ]}
    <div>
    {if $params.price > 0}{$params.price} руб.{else}цена по запросу{/if}
    </div>

    Вот тут условие не работает, так как $params.price не является числом.

    Что я делаю не так? Посоветуйте пожалуйста!

    • здравствуйте, к сожалению, не работал со Smarty.

  • Многие люди обвиняют MODX в том, что он не умеет хранить чанки в файлах и вынуждает лишний раз работать с базой данных. Это и неудобно для системы контроля версий, и медленнее.

    • Кто вам такое сказал, что Modx не может хранить в файлах чанки?
      Посмотрите у каждого чанка, шаблона, сниппета, есть опция "статичный". Жмете на нее и слева появляется окно для выбора пути сохранения. Сохраняете. Далее, работаете уже в этом файле, где сохранили, через FTP, например. А чтобы обновлялось после каждой загрузки, не забывайте сбрасывать кеш страница, шаблона или этого чанка, либо вызов как некешируемый [[!$chunk_name]]

      • Спасибо, за некешируемый знал, а вот по статичному - не проверял

    • С другой стороны меньше обращение к файлам :)
      Я думаю что хранение в БД лучшее решение.

Recent Posts

Как заработать токен NOT за стейкинг BNB или FDUSD

Очень много разговоров в последнее время за токен NOT. Много бирж будут делать листинг токена,…

6 месяцев ago

Как заработать TON и NOT за стейкинг в телеграм

Телеграм недавно запустил возможность стейкать (замораживать) USDT и получать за это их валюту TON. Очень…

6 месяцев ago

Бонус 100 USDT +10 BUSD от Binance

Биржа криптовалют Binance проводит сейчас промо-акцию: новым пользователям дают ваучеры в сумме 110 долларов. Деньги…

3 года ago

Как парсить длительность видео youtube на php в привычном виде

Самый главный момент в работе с youtube - это получить ключ api через консоль разработчика…

3 года ago

Как удалить чужую сессию пользователя в ubuntu (linux)

Арендую сервер для небольшого проекта на python. И вот приходит мне уведомление, что за сутки…

3 года ago

Как наложить watermark на видео в python windows массово

Тестирую одну схему, и нужно на много видео наложить watermark. Решил делать через Python 3,…

3 года ago