Вывести значения только используемых TV в ресурсах по двум параметрам
Здравствуйте, делаю Ajax фильтр, с поиском по TV полям выглядит это так:
Опции формируются сниппетом, который собирает только используемые значения TV полей со всех ресурсов, объединяя дубли, вот код сниппета:
Подскажите пожалуйста как для этого изменить сниппет? Догадываюсь что в запрос
Опции формируются сниппетом, который собирает только используемые значения TV полей со всех ресурсов, объединяя дубли, вот код сниппета:
<?php
// $tvid = 7; // id нужного ТВ параметра
$res = array(); // Сюда забиваем результаты
$counter = 1;
$output = '';
$q = $modx->newQuery('modTemplateVarResource', array('tmplvarid' => $tvid, ));
$q->select('value');
$q->groupby('value'); // исключаем дубли
if ($q->prepare() && $q->stmt->execute()) {
while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
$res[$counter] = $row['value'];
$counter++;
}
}
foreach($res as $val){
$output .= '<option value="'.$val.'">'.$val.'</option>';
}
echo $output;
Все работало нормально до тех пор как не было добавлено новое TV поле с двумя значениями Аренда==1||Продажа==2 и теперь фильтр для аренды должен отобразить только значения используемых TV ресурсов согласно этому новому полю, т.е. идея в том чтобы фильтр не показывал опции ресурсы которых «для продажи» и наоборот. Подскажите пожалуйста как для этого изменить сниппет? Догадываюсь что в запрос
$q = $modx->newQuery('modTemplateVarResource', array('tmplvarid' => $tvid, ));
нужно подставить еще один параметр — со значением Аренды или Продажи… Но своих знаний маловато как это сделать… Буду благодарен за любую помощь ) Комментарии: 2
Вообще, когда своих знаний маловато, используют готовые решения, для фильтрации это mSearch2. Но если хочется сделать самому, вот хорошая статья по составлению запросов в modx.
Спасибо за ссылку на отличную статью которая расширила мое понимание.
Но добиться нужного результата в запросе так и не смог, пришлось собирать все значения и затем через foreach сравнивать и получать нужные данные…
Но добиться нужного результата в запросе так и не смог, пришлось собирать все значения и затем через foreach сравнивать и получать нужные данные…
<?php
$tag = 1; // 1 аренда или 2 продажа;
$query = $modx->newQuery('modTemplateVarResource');
$query->select(
array('tmplvarid','contentid','value')
);
$query->sortby('FIELD(tmplvarid,7,11,13,9,12,14,15)'); // нужный порядок
$query->where(array(
'tmplvarid:IN'=> array(7,11,13,9,12,14,15) // получим значения всех тв в кучу
));
$resources = $modx->getIterator('modTemplateVarResource',$query);
$AparttagTVs = [];
$TVs = [];
$text = '';
// 7 поле которое отвечает за вывод всех полей
// из результата запроса создаю массив только по этому полю
foreach ($resources as $apt) {
if ($apt->get('tmplvarid') == 7) {
$AparttagTVs[$apt->get('contentid')] = $apt->get('value');
// $output .= '<p>tmplvarid:'.$apt->get('tmplvarid').' $apt: '.$apt->get('contentid').' = '.$apt->get('value').'</p>';
}
}
// перебираю весь результат запроса и создаю новый массив только с теми значениями полей у ресурсов которых в поле 7 задано аренда или продажа
foreach ($resources as $resource) {
if ($AparttagTVs[$resource->get('contentid')] == $tag ) {
$TVs[$resource->get('tmplvarid')][] = $resource->get('value');
// $output .= '<p>tmplvarid:'.$resource->get('tmplvarid').' $resource: '.$resource->get('contentid').' = '.$resource->get('value').'</p>';
}
}
// вывожу все поля
foreach ($TVs as $key => $v ) {
$TVs[$key] = array_unique($TVs[$key]);
if ($key !== 7) {
$text .= '
<select name="name'.$key.'">
<option value="">Field-'.$key.'</option>';
foreach ($TVs[$key] as $k => $val) {
$text .= '<option value="'.$val.'">'.$val.'</option>';
}
$text .= '</select>';
// $output .= '<p>'.$val.'-'.$text.'</p>';
}
}
// echo '<pre>';
// echo print_r($AparttagTVs);
// echo '</pre>';
// echo '<pre>';
// echo print_r($TVs);
// echo '</pre>';
// echo $output;
return $text;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.