Нестандартная выборка документов в DocLister

Всем привет, не получается сделать правильную выборку страниц через сниппет DocLister.

Имеем множество документов контейнеров, являющимися категориями.
В категориях дочерние документы, в виде веб-ссылки. Данные дочерние документы (веб-ссылки) должны иметь возможность привязываться и к другим категориям. Это реализовано через тв-параметр [*category-ids*]:
Тип ввода: listbox (multi-select),
Возможные значения: @SELECT pagetitle,id FROM modx_site_content WHERE parent=0 AND isfolder=1 AND template=95 ORDER BY pagetitle ASC
Delimiter: ","
При создании дочернего документа (веб-ссылки) в нужной категории, мы также указываем дополнительные категории в которых должна выводится данная ссылка.

В шаблоне категории вывод ссылок делается так:
[[DocLister?
&idType=`parents`
&parents=`0`
&total=`0`
&tvList=`category-ids`
&tvPrefix=``
&tpl=`tpl`
&depth=`1`
&orderBy=`pub_date DESC`
&renderTV=`category-ids`
&filters=`OR(content:parent:is:[*id*];tv:category-ids:like:[*id*])`
]]
content:parent:is:[*id*] — выводит документы, у которых id родителя равно id текущей категории, т.к. все дочерние документы
tv:category-ids:like:[*id*] — выводит документы, у которых выбран тв-параметр category-ids равный id текущей категории.
В базе данных значения тв-category-ids выглядит как пример в виде 21586||25881||29218, на выходе из-за параметра &renderTV имеем 21586,25881,29218, если &renderTV не указывать то будет использоваться значения из базы.

На первый взгляд все работает, но не правильно.
Если id категории к примеру равно 200, то в выборку попадают не только документы с id=200, но и документы с category-ids равные «13590,20016» и «20045» и «21200».

Наверняка данная задача является не редкостью и существуют решения, которые я не смог найти. Очень прошу помочь. Заранее спасибо!

8 комментариев

avatar
А почему like, а не равно в filters?
avatar
равно работает только если в category-ids указано один id, а если несколько, то не работает
avatar
тогда in использовать надо, like по образцу ищёт
avatar
in тоже пробовал, не работает, возможно он ведет фильтрацию со значений из базы «21586||25881||29218» а не по выходным значениям «21586,25881,29218»
avatar
Значит нужно уже после возвращения из базы фильтровать в prepare-снипетте
avatar
&debug=`1` подскажет как происходит фильтрация.
А вообще для подобной фильтрации есть решение от автора Doclister. Очень удобная штука.
avatar
Вот вариант решения через prepare.
avatar
попробуйте еще такой вариант
&addWhereList=`FIND_IN_SET([*id*], REPLACE(tv.category-ids, '||', ','))>0`
и в &filters уберите tv:category-ids:like:[*id*]
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.