Doclister - как корректно реализовать выборку по TV

Доброго дня!

История такая:

Есть дерево разделов с подразделами и есть каталог где содержатся документы, у каждого документа задан TV (parent-id) в котором содержится id раздела, к которому он относится.

Вопрос, как корректно организовать выборку в дереве разделов. Сейчас это реализовано очень криво, через вызов вложенного DocLister в параметре &filters, который формирует список id.




[[Doclister?
&id=`TableList`
&controller=`site_content`
&parents=`13`
&showNoPublish=`0`
&tvPrefix=``
&tvList=`img,material,parent-id`
&tpl=`TableListTpl`
&filters=`AND(tv:parent-id:in:[[DocLister?&id=`TabListId`&controller=`site_content`&parents=`[*id*]`&showNoPublish=`0`&tvPrefix=``&showParent=`1`&tpl=`@TPL:[+id+],`&tplLast=`@TPL:[+id+]`]])`
]]


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

avatar
То ли вы слишком что-то заумное делаете, то ли я не проснулся. Но возможно вам поможет реорганизация ТВ на вот это вот решение.
Ну и showNoPublish и controller — они и так определены по умолчанию
avatar
О, не это конечно крутое решение, у меня тут задача проще.
К примеру есть категория «1», у неё есть подкатегория «2», и в отдельной папке содержатся документы у которых есть TV параметр, в которых прописан id поджкатегории «2».
Мне же надо написать такой вызов, чтобы при выводе в категория «1» в неё попадали документы всех её подкатегорий и в том числе подкатегории «2». А если мы находимся в подкатегории «2», то выводились только документы где в TV прописан id поджкатегории «2».

Данный вызов сечейчас работает именно так, showNoPublish и controller конечно можно убрать. Вопрос в том, возможно это реализовать более компактно и куда копать в SQL конструкцию или мутить что-то с prepare, или есть что-то более простое? Другими словами, как для выборки получить id текущего документа и его дочерних и не городить огород…
Комментарий отредактирован 2019-06-16 17:55:15 пользователем doggydogg
avatar
так а чем тогда depth не устраивает то? Либо, опять же я не проснулся)
Можешь кусок древа показать и стрелочками что где должно выводится? Хоть убей — не догоняю что нужно(
avatar
+ Категория 1
-+ Подкатегория 2
-+ Подкатегория 3
+ Архив документов 4
— Документ 5 (с TV содержащим ID подкатегории 2)
— Документ 6 (с TV содержащим ID подкатегории 3)
— Документ 7 (с TV содержащим ID категории 1)
Комментарий отредактирован 2019-06-16 18:13:49 пользователем doggydogg
avatar
и при вызове в категории 1 тебе нужно чтобы выдались 2,3,5,6,7 — верно?
avatar
При вызове в категории 1 — конечный результат должен быть вывод документов: 5,6,7.
А, к примеру, при вызове в подкатегории 2 — конечный результат должен быть вывод документов: 5.
avatar
Ну мне в голову приходит еще бОльший велосипед типа такого:
getChildrensForFilter
<?php
$children = implode(',',$modx->getChildIds($modx->documentIdentifier, 0));
if (count($children)) $children.=','.$modx->documentIdentifier;
else $children=$modx->documentIdentifier;
$ids = $modx->db->getValue('select GROUP_CONCAT(contentid) from '.$modx->getFullTableName('site_tmplvar_contentvalues').' 
where tmplvarid=42 and value in ('.$children.')'); //42 - id tv где деньги лежат
if (!$ids) $ids = '-1';
return 'c.id in ('.$ids.')';

В вызове DL добавляем:
&addWhereList=`[ !getChildrensForFilter! ]`

Но, повторюсь — это, ИМХО, еще большее извращение)
avatar
Спасибо за участие! Думал, что есть какой-то быстрый вариант решения, но видимо нет или мы о нём пока не знаем…
Комментарий отредактирован 2019-06-20 11:44:29 пользователем doggydogg
avatar
Пожалуйста! Но у тебя какая-то слишком хитрая выборка, имхо) Тут можно подумать в сторону реорганизации древа)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.