Вывести значения только используемых TV в ресурсах по двум параметрам

Здравствуйте, делаю Ajax фильтр, с поиском по 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, ));
нужно подставить еще один параметр — со значением Аренды или Продажи… Но своих знаний маловато как это сделать… Буду благодарен за любую помощь )
Konstantin
29 декабря 2022, 23:35
modx.pro
850
0

Комментарии: 2

Артур Шевченко
30 декабря 2022, 00:12
0
Вообще, когда своих знаний маловато, используют готовые решения, для фильтрации это mSearch2. Но если хочется сделать самому, вот хорошая статья по составлению запросов в modx.
    Konstantin
    31 декабря 2022, 11:25
    0
    Спасибо за ссылку на отличную статью которая расширила мое понимание.
    Но добиться нужного результата в запросе так и не смог, пришлось собирать все значения и затем через 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;
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2