[РЕШЕНО] Нестандартная выборка документов в 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».

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

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

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*]
avatar
Благодарю всем за ответы, каждое решение имеет право на существование.
С помощью предложенных вариантов получил такое решение:

[[DocLister? &idType=`documents` &documents=`[[num? &id=`[*id*]`]]` &idType=`parents` &parents=`[*id*]` &total=`0` &display=`0` &tvList=`category-ids` &depth=`1` 
&orderBy=`pub_date DESC` &tpl=`tpl` &tvPrefix=``]]


В данном вызове снипетом num идет выборка ID ресурсов у которых в ТВ параметре дополнительной категории содержится ID данной страницы, в нем же производится подмена "||" на ",".
Также в выводе участвуют все дочерние документы данной категории.

Сниппет num содержите следующее:

<?php
global $modx;
$id = $id;
$tmplvarid = '77'; // идентификатор ТВ-параметра дополнительных категорий, в моем случае [*category-ids*]
$table = $modx->getFullTableName('site_tmplvar_contentvalues');
$find = " AND FIND_IN_SET('".$id."',REPLACE(value, '||', ','))>0 ";
$res = $modx->db->query("SELECT contentid FROM $table WHERE tmplvarid='$tmplvarid' $find");
while ($row=$modx->db->getRow($res)) {
    $ids[] = $row['contentid'];
    $str = implode(',', $ids);
}
return $str;
?>


Надеюсь кому-нибудь пригодится. Еще раз всем спасибо за помощь!
avatar
Надеюсь кому-нибудь пригодится
так Вам уже и пригодилось))
modx.im/blog/questions/4404.html#comment34245
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.