Если вынести формирование строки условия фильтра в сниппет, выборка не работает
Есть страница, в которой вызывается чанк. В этом чанке находится следующий код:
[[!blog? &alias=[[*alias]]]] - чтобы контролировать что происходит в сниппете
[[pdoResources?
&parents=`2`
&depth=`0`
&tpl=`ListRowTplDopLinks`
&includeContent=`1`
&setTotal=`1`
&toPlaceholder=`slider-links`
&includeTVs=`taxonomy`
[[-&where=[[blog? &alias=[[*alias]]]]]]
&tvFilters=`[[blog? &alias=[[*alias]]]]`
&resources=`-364`
]]
[[+slider-links:!empty=`
<div class="container pt-20 pb-40">taxonomy==88||taxonomy==80
<div class="slider-dop-links-wrap">
<div class="flex-betwen flex-wrap">
<div class="title">
<p class="h3">Новости по этой услуге</p>
</div>
<div class="flex-end pb-20">
[[+total:gt=`3`:then=`
<a class="slider-3-news prev-links" href="javascript:void(0)"><i class="fa fa-angle-left" aria-hidden="true"></i></a>
<a class="slider-3-news next-links" href="javascript:void(0)"><i class="fa fa-angle-right" aria-hidden="true"></i></a>`]]
</div>
</div>
<div class="container pt-20 pb-20">
<div id="NewsSlider" class="slider-dop-links owl-theme owl-carousel">
[[+slider-links]]
</div>
</div>
</div></div>
`]]
Сниппет выполняет следующую задачу — из таблицы выбирает все новости которые относятся к этой статье, а затем возвращает строку для фильтрации. Например, если фильтровать по TV taxonomy это будет строка 'taxonomy==88||taxonomy==80'
Код сниппета:<?php
global $modx;
if($_GET['cat']){
$alias = $_GET['cat'];
$resource = $modx->getObject('modResource', array('alias' => $alias));
$id = $resource->toArray()['id'];
$exist_sql = "SELECT * FROM modx_ct_rootCategory WHERE `root_category` LIKE \"%$id%\"";
$exist = $modx->query($exist_sql)->fetchAll(PDO::FETCH_ASSOC);
$related = [];
for($i = 0; $i < count($exist); $i++) {
$exploded[] = explode("||", $exist[$i]['related_category']);
foreach($exploded as $related_items){
foreach($related_items as $related_item){
$related[] = 'taxonomy == %' . $related_item . '%';
}
}
}
$filterBy = array_unique($related);
var_dump(implode('||', $filterBy));
return implode('||', $filterBy);
} else if($alias){ //{"id:IN":[914,919]}
$resource = $modx->getObject('modResource', array('alias' => $alias));
$id = $resource->toArray()['id'];
var_dump($id);
$exist_sql = "SELECT * FROM modx_ct_rootCategory WHERE `related_category` LIKE \"%$id%\"";
$exist = $modx->query($exist_sql)->fetchAll(PDO::FETCH_ASSOC);
var_dump($exist);
$related = [];
for($i = 0; $i < count($exist); $i++) {
$exploded[] = explode("||", $exist[$i]['related_category']);
foreach($exploded as $related_items){
foreach($related_items as $related_item){
$related[] = 'taxonomy == %' . $related_item . '%';
}
}
}
$filterBy = array_unique($related);
return implode('||', $filterBy);
//return "taxonomy==88||taxonomy==80";
}
Если эту строку прописать в параметре tvFilters, то все работает. Если просто вернуть ее из сниппета, не делая никаких изменений до — работает. Запросы к базе, все отрабатывает, в вызове сниппета в самом верху возвращается правильная строка. Если пойти по другому пути и взять айди нужных ресурсов, сформировать из них строку (указана в комментарии на строке с else if), история та же самая — напрямую работает, а из сниппета нет.Почему так происходит? Я бы понял если бы он ничего из сниппета не принимал, но ведь просто
return "taxonomy==88||taxonomy==80";
работает Комментарии: 1
Оказалось, что если вернуть просто айдишники нужных статей, а затем сделать фильтр по полю resources, то все работает. Но тем не менее хотелось бы знать почему было такое поведение
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.