Форматы записи фильтров &where по TV-параметрам

На что следует обратить внимание:
===========================================
1. Форматы записи фильтров по TV-параметрам (getResources и getProducts — в &tvFilters, pdoResources — в &where) не совместимы между собой
Формат записи фильтров в pdoResources — чистый JSONxPDO, т.к. для этого используется JSONxPDO-параметр &where:
rtfm.modx.com/display/xPDO20/xPDOQuery.where
`{«tv1»:«5»}`
`{«tv1:=»:«5»}`
`{«tv1:!=»:«5»}`
`{«tv1:>»:«5»}`
`{«tv1:>=»:«5»}`
`{«tv1:<»:«5»}`
`{«tv1:<=»:«5»}`
`{«tv1:LIKE»:"%5%"}`
`{«tv1:NOT LIKE»:"%5%"}`
`{«tv1:LIKE»:"%5%", «OR:tv2»:«8»}`
`{«tv:IN»:[7,8,9,10]}`
`{«tv:NOT IN»:[7,8,9,10]}`
`{«tv1:IS»:null}` // null — в нижнем регистре
`{«tv1:>=»:«5», «AND:tv2»:«8»}`
`{«tv1:<»:«5», «OR:tv2:LIKE»:"%58"}`
`{«tv1:!=»:«5», «OR:tv2:NOT LIKE»:"%8%"}`
`{«tv1:LIKE»:"%5%", «OR:tv2:!=»:«8»}`
`{«tv1:LIKE»:"%5%", «OR:tv2:<»:«8»}`
`{«tv1:LIKE»:"%5%", «AND:tv2:<»:«8», «OR:tv3:<»:«9»}`
и т.д.

Формат записи фильтров в параметре &tvFilters (getResources и GetProducts) — НЕ JSON, но похож на него:
modx.by/docs/modx-add-ons/getresources/
`tv1===%2%` // SQL: =
`tv1==%2%` // SQL: LIKE
`tv1!==5` // SQL: !=
`tv1==%2% || tv2!==100` // ИЛИ
`tv1==%2%, tv2!==100` // И
и т.д.

===========================================
2. У JSONxPDO-фильтров с любым числовым ключом (знак числа не важен):

&where=`{"0":["CONCAT('||', TVtv1.value, '||') LIKE CONCAT('%||', '5', '||%')"]}`&where=`{"parent":"2", "0":["CONCAT('||', TVtv1.value, '||') LIKE CONCAT('%||', '5', '||%')"]}`

в ходе формирования xPDO-запроса ключ в конечный запрос НЕ помещается. В конечном запросе остается только значение:

CONCAT('||',TVtv1.value,'||') LIKE CONCAT('%||','5','||%')

Замечание: при указании ключа квадратные скобки можно не указывать.

И это НЕ заслуга pdoTools (сниппета pdoResources, в частности), а заслуга метода xPDOQuery->prepare().

===========================================
3. Если в JSONxPDO-параметр необходимо вписать сложное SQL-условие (в этом случае ключ JSON-пары должен либо отсутствовать, либо быть числом), например:

&where=`["CONCAT('||', TVtv1.value, '||') LIKE CONCAT('%||', '5', '||%')"]`&where=`{"0":["CONCAT('||', TVtv1.value, '||') LIKE CONCAT('%||', '5', '||%')"]}`

то это условие уже будет невозможно объединить с другим условием логикой «OR».

Т.е. вот такие варианты не прокатят:

&where=`"tv1":"7", ["OR:CONCAT('||', TVtv2.value, '||') LIKE CONCAT('%||', '5', '||%')"]`&where=`"tv1":"7", "OR:":["CONCAT('||', TVtv2.value, '||') LIKE CONCAT('%||', '5', '||%')"]`&where=`{"tv1":"7", "OR:0":["OR:CONCAT('||', TVtv1.value, '||') LIKE CONCAT('%||', '5', '||%')"]}`

Замечание: при указании ключа квадратные скобки можно не указывать.

Тогда как при указании классических JSONxPDO-условий объединение их логикой «OR» не составляет проблем:

&where=`"tv1":"7", "OR:tv2:LIKE":"&5%"]`
Cyrax_02 09 августа 2013, 21:17 # 
Василий, ещё одна проблема, так или иначе связанная с вашим сниппетом pdoResources.
Поскольку проблема несколько общего характера, здесь писать не стал — оформил отдельным топиком:
bezumkin.ru/sections/help/1615/
Вопрос заключается в том, как одновременно проверять некоторое поле и на пустое значение, и на null.

================================================================================
А что касается исключительно вашего сниппета, то в статье Вы написали:
&tvFilters — не реализовано, но работает при указании ТВ в &where, например
 
А если нужно проверить наоборот, на равенство пустому значению?
Такие варианты не вернут ни одного ресурса:
[­[!pdoResources?&includeTVs=`test`&where=`{"test:=":""}`]­][­[!pdoResources?&includeTVs=`test`&where=`{"test":""}`]­]

Если нужно проверить на пустое значение, нужно проверять именно на NULL:
[­[!pdoResources?&includeTVs=`test`&where=`{"test:IS":null}`]­]
Поскольку:
а) в pdoResources в конечном запросе пользовательские TV-параметры присоединяются через LEFT JOIN
б) в таблице site_tmplvar_contentvalues пустые значения отсутствуют
то в конечном запросе пользовательские TV-параметры, которым не заданы значения, будут иметь значения NULL.

================================================================================
А ведь мало кто держит в голове этот ньюанс. При проверке на пустое значение стандартных параметров мы так и поступаем:
[­[!pdoResources?&where=`{"introtext":""}`]­]
И это работает.