[MODX, MiniShop2] Примеры выборки where, optionFilters, innerJoin

WHERE в proResouces, msProducts
Примеры использования в pdoTools

  • &where=`{"parent=":75}`
    &where=`{"parent":75}` — Выбрать ресурсы по паренту. Эквивалентно &parents=`75` (если не указан никакой знак, то по умолчанию это =)
  • &where=`{"template:IN":[1,2,3]}` — Выборка по массиву значений. (Только ресурсы некоторых шаблонов)
  • &where=`{"parent:NOT IN":[75,147,80]}` — Выборка за исключением массива значений. (Ресурсы, кроме тех, у которых родителем является 75,147,80)
  • &where=`{"Data.old_price:>":0}` — Условие "больше чем". (Товары, у которых указана старая цена)
  • &where=`{"Data.old_price:<=":1000}` — Условие "меньше или равно"
  • &where=`{"uri:LIKE":"%games%"}` — Условие WHERE LIKE (содержит подстроку "games")
  • &where=`{"uri:NOT LIKE":"games%"}` — Условие WHERE NOT LIKE (подстрока не начинается на "games")
  • &where=`{"uri:LIKE":"%games"}` — Условие WHERE LIKE (содержит подстроку "games", которая находится в конце строки)
  • Условия AND, OR
  • &where=`{"article:LIKE":"PGS_%","Data.price:<":500}` — Условие AND (article начинается на "PGS_" и цена больше 500)
  • &where=`{"parent":4,"OR:template":5}` — Условие OR

&optionFilters, NOT IN
Выборка товаров по опциям

Входные данные:

  • Опции товара exist (тип «Выпадающий список»), в которой указывается статус наличия/доставки

Задача

  • Сделать выборку по тем товарам, у которых НЕ указаны статусы "Нет в наличии" и "Только самовывоз"
[[!msProducts?
  &parents=`0`
  &depth=`10`
  &limit=`0`
  &tpl=`yml_offer`
  &optionFilters=`{"exist:NOT IN":[ "Нет в наличии", "Только самовывоз" ]}`
]]

&innerJoin, msProductOption
Выбрать товары по диапазону дат, указанных в опциях

Входные данные:

  • Опции товара yml_promo_start и yml_promo_end, формата Дата (2018-10-24)

Задача

  • Выбрать товары, у которых указанная дата начала акции yml_promo_start больше или равна текущей даты, а yml_promo_end меньше или равна текущей дате.

Как это сделать через &optionFilters я не понял (пожалуйста, напишите в комментариях если вы знаете решение). Но через &innerJoin вполне:

(Соответствие названия классов с названиями таблиц в MySQL)

[[!msProducts?
  &parents=`0`
  &depth=`10`
  &limit=`0`
  &tpl=`yml_promo`
  &innerJoin=`{
  "option1": {
    "class": "msProductOption",
    "on": "option1.key = 'yml_promo_end' AND option1.product_id = msProduct.id AND option1.value != 0 AND option1.value >= now()"
  },
  "option2": {
    "class": "msProductOption",
    "on": "option2.key = 'yml_promo_start' AND option2.product_id = msProduct.id AND option2.value != 0 AND option2.value <= now()"
  }
}`
]]

&tvFilters
Выборка по доп. полям (TV-полям)

Теория (примеры ниже)

Соответсвие операторов, используемых в &tvFilters с операторами SQL. Найдены внутри метода addTVFilters в файле core/components/pdotools/model/pdotools/pdofetch.class.php

Кому-то эта информация покажется избыточной, но я думаю, что это следует знать, чтобы четко понимать во что преобразается написанный вами запрос, и соответсвенно лучше контролировать результат.

Слева указан вид, который пишем при вызове сниппета, справа — то, что получается при формировании запроса. В примерах преобразования показано как это происходит. (Вы легко сможете повторить эти эксперементы, запустив сниппет с параметром &showLog=`1`)

  • <=> => <=>
  • === => =

    Примеры преобразования:
    &tvFilters=`mytvname===Lorem ipsum dolor sit amet`
    `TVmytvname`.`value` = 'Lorem ipsum dolor sit amet'

  • !== => !=
  • <> => <>
  • == => LIKE

    Примеры преобразования:
    &tvFilters=`mytvname==Lorem ipsum dolor sit amet`
    `TVmytvname`.`value` LIKE 'Lorem ipsum dolor sit amet'

    Еще один пример:
    &tvFilters=`mytvname==%Lorem%`
    `TVmytvname`.`value` LIKE '%Lorem%'

  • != => NOT LIKE

    Примеры преобразования:
    &tvFilters=`mytvname!=%Lorem%`
    `TVmytvname`.`value` NOT LIKE '%Lorem%'

  • << => <
  • <= => <=
  • =< => =<
  • >> => >
  • >= => >=
  • => => =>

Примеры использования &tvFilters

Вывести только ресурсы, у которых ТВ important-page (тип «чекбокс») отмечен

  • &tvFilters=`important-page==1`

Комментарии (1)

  1. Евгений 02 августа 2020, 13:39 # 0
    Спасибо полезно

    У меня такой вопрос

    Есть вывод ресурсов
    [[pdoResources?
    	&parents=`[[++locations_plans]]`
            &tpl=`@INLINE <a href="[[+alias]]">[[+menutitle]]</a>`
            &tvPrefix=``
            &where=`{"city:=":"Санкт–Петербург","template:=":3}`
            &includeTVs=`city`
    ]]
    
    так вот где
    city:=":«Санкт–Петербург

    в Санкт-Петербург приходится использовать тире, если ставить там „-“ (минус)
    ничего не работает

    как научить where корректно обрабатывать знак минус?
    заэкранировать его както или что?
    *Комментарий будет опубликован после проверки модератором

    Похожие статьи

    Генератор настроек MIGX

    Документация на русском по MODX MIGX

    Подсказки по работе и заготовки для MiniShop2

    pdoPage и getImageList - Постраничная навигация MIGX

    Импорт и экспорт в MiniShop2. Реализация 1

    Как включить HTTPS (SSL) в MODX - Подробная инструкция

    Генерация YML для выгрузки в маркет

    Примеры работы с API MODX

    Примеры выборки where, optionFilters, innerJoin

    pThumb - ресайз изображений. Примеры использования.

    Расширение свойств товаров minishop2

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

    Сайт на обслуживании (выключить сайт)

    Добавить в письмо контактную информацию

    Вывести getImageList только если он не пустой

    Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

    Оформление и настройка easyComm. Комментарии и отзывы на сайте.

    Поиск на сайте с пакетом SimpleSearch

    Простая и симпатичная галерея fancybox

    Подсчет и вывод количества потомков ресурса в MODX

    Галерея. Вывести обложки альбомов и фотографии

    Вывод tv-параметров в формате -

    Отредактировать письмо о заказе - добавить ТВ поле, или что-то еще

    Quip для MODX. Более рабочий вариант

    pdoResources Заготовки для работы

    Сниппет для вывода размера и расширения файла

    Простой аудио-плеер HTML5

    Вывести список всех опций MiniShop2

    Слайдер Slick slider в контенте ресурса

    Как контролировать кэш CSS и скриптов

    Изменить цену на товар в зависимости от количества при добавлении в корзину minishop2

    Подключить MODX в стороннем PHP файле

    Простейшая авторизация

    Как создать ресурс процессором $modx->runProcessor('resource/create', $props)

    Красивое адаптивное меню под pdoMenu

    Массово обновить ТВ, или другое поле через базу

    Создать свою страницу в админке

    Изменить формат номера заказа

    Сообщение о том, что сайт использует Cookie

    Получить grandparent. Вывести родитель родителя

    Симпатичный список файлов, загружаемых к ресурсу через MIGX

    Установить шаблон по-умолчанию для новых, создаваемых ресурсов

    Вывести все доступные плейсхолдеры

    Создать источник файлов

    Отредактировать шаблон письма

    Добавить скрипт перед тегом body

    Общая сумма по каждому товару в корзине Minishop2

    Создать раздел с паролем на сайте MODX

    Что делать если ее приходит почта администратору

    Фильтрация по TV параметрам в msProducts

    Дата на русском

    FontAwesome - часто используемые иконки для шаблонов MODX

    Создать пакет с пользовательской таблицей

    Заготовки для работы

    Курсы валют с cbr.ru на PHP

    Загрузка сниппета после загрузки страницы через AjaxSnippet

    getResources заготовки

    Обязательный чекбокс при оформлении заказа

    Обработка остатков заказа в miniShop2

    Соответствие названия классов с названиями таблиц в MySQL

    Разбить вывод pdoResources на несколько колонок (блоков)

    Баннеры с использованием BannerY

    Обновить alias (псевдоним) у всех ресурсов

    CSS для постраничной навигации pdoPage

    Вывести время загрузки (формирования) страницы

    Расширить таблицу site_content (объект modResource) за 5 минут

    Вырезать кавычки — фильтр-сниппет MODX

    Счетчик посещений и скачиваний для сортировки ресурсов

    Бесплатная доставка от 5000 рублей в MiniShop2

    Динамическое поле emailSubject в FormIt

    Скрыть информацию о том, что сайт работает на MODX

    Отсортировать ресурсы по количеству комментариев Quip MODx

    Изменить цену на товар, если в корзине лежит товар из особой категории minishop2

    Создать редирект через autoRedirector API

    Ответ для сервиса moneta.ru

    Cортировать по списку id в pdoResources и pdoTools

    Вывести 404 ошибку по настройке TV MODX

    Email сделать не обязательным полем

    Как разместить исходный код сниппета на сайте, в документации

    Ускорить установку MODX revo до пары кликов

    Постраничная навигация — набор параметров и CSS PdoPage

    Сделать все элементы статичными для Git и IDE

    Не работает подгрузка товаров ajax mfilter2 на мобильном

    Сделать поле размер обязательным

    Настройка стилей для комментариев Tickets

    Подключить текстовой редактор к доп. полям ресурса

    Кастомный чанк для AdminPanel

    Динамическая замена шаблона ресурса - плагин

    Разместить корзину внутри блока с оформлением заказа

    Плагин для формирования замороженных URL с редиректом

    xPDO Выборка из одной таблицы с зацепкой значения из другой

    Приветственный экран / заглушка на сайт

    Вложенные условия в xPDO MODX

    Вывести список всех родителей в ТВ поле ресурса

    Как получить данные пользователя сразу после авторизации через API

    Вывести список всех емэйлов miniShop2

    Если getParentIds не работает в плагине

    Контролировать кэширование файлов CSS и JS MiniShop2

    Не приходят / не отправляются письма - в чем причина?

    Кэширование в MODX: использование $modx->cacheManager

    Наш сайт использует куки, нажмите «ОК» если вы не против
    OK