Фильтр по категории без использования mSearch2

Здравствуйте!
Прошу помочь в таком вопросе.
В связи с отсутствием возможности использования mSearch2 был нужен альтернативный вариант реализации фильтра по категории.
За основу взять скрипт и сниппет из примера webdesign-master.ru/blog/modx/2016-05-03-modx-ajax-filter.html
Мой сниппет catalogFilter выглядит так (количество tv-параметров в дальнейшем хочу увеличить):
<?php
//Filter Fields Settings
$filter = array();

//Radio, Select & Text Fields Type
if($_GET['n_price']) {
    $filter[] = 'n_price<='.$_GET['n_price'];
}

//End Settings

//Sort
if($_GET['sortby']) {
    $sortby = $_GET['sortby'];
} else {
    $sortby = 'pagetitle';
}
if($_GET['sortdir']) {
    $sortdir = $_GET['sortdir'];
} else {
    $sortdir = 'asc';
}
//End Sort

//Offset
$offset = 0;
if($_GET['offset']){
    $offset = $_GET['offset'];
}

if($filter) {
    $where = $modx->toJSON(array($filter));
} else {
    $where = '';
}

$params_count = array(
    'parents' => $parents,
    'limit' => 0,
    'tpl' => '@INLINE ,',
    'select' => 'id',
    'includeTVs' => $fields,
    'showHidden' => '1',
    'where' => $where
);

$count = $modx->runSnippet('pdoResources',$params_count);
$count = count(explode(',',$count))-1;
$modx->setPlaceholder('count',$count);

$params = array(
    'parents' => $parents,
    'limit' => $limit,
    'offset' => $offset,
    'tpl' => $tpl,
    'select' => 'id,pagetitle,introtext,content',
    'includeTVs' => $fields,
    'showHidden' => '1',
    'sortby' => $sortby,
    'sortdir' => $sortdir,
    'where' => $where
);

$more = $count - $offset - $limit;
$lim = $more > $limit ? $limit : $more;

$button = '';
if($more > 0){
    $button = '<div class="ajax-filter-count" data-count="'.$count.'"><a href="#" class="ajax-more">Загрузить еще '.$lim.' из '.$more.'</a></div>';
}

return $modx->runSnippet('pdoResources',$params).$button;
Далее пробую получить результат работы сниппета (использую Fenom)
{set $res = $_modx->runSnippet('!catalogFilter', [
                                'parents' => $_modx->resource.id, 
                                'fields' => 'n_price',
                                'limit' => '3',
                                'tpl' => '@FILE chunks/tplCatItem.tpl',
                                'toPlaceholder' => 'sresults'
                            ])}
                            
                            {$_modx->getPlaceholder('sresults')}
                            
                            {$res}
                            {'!pdoPage' | snippet : [
                                'parents' => $_modx->resource.id, 
                                'depth' => '1', 
                                'includeTVs' => 'n_price', 
                                'tvPrefix'=>'',
                                'tpl' => '@FILE chunks/objectTpl.tpl'
                                'resources' => $res.id
                                ]}
Выводится массив с параметрами ресурса правильно, фильтрация работает. Но вывести отфильтрованные значения в pdoPage не получается.
Подскажите, пожалуйста, что может быть неправильно?
Спасибо за участие!
Olga
10 июня 2019, 21:29
116
0

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

    Olga
    11 июня 2019, 09:39
    0
    Спасибо большое, попробую!
    Olga
    12 июня 2019, 19:36
    0
    Все работает, спасибо!

    А можете подсказать как изменить where, чтобы в условии значения были меньше или равны TV-параметру? Не могу разобраться с синтаксисом.

    <?php
    if ($modx->context->key == 'mgr' || empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') return;
    switch ($_POST['action']) {
        case 'filter':
            $output = array('success' => false, 'message' => '');
            
            // Проверяем, что hash получен и параметры pdoPage существуют
            if (isset($_POST['hash']) && !empty($_POST['hash'])
                && isset($_SESSION['pdoPage'][$_POST['hash']])
                && !empty($_SESSION['pdoPage'][$_POST['hash']])) {
    
                $hash = (string) $_POST['hash'];
                
                // Указываем только ТВ, доступные для фильтрации
                $tvs = array('n_price');
                
                // Наполняем условие выборки
                $where = array();
                foreach ($tvs as $tv) {
                    if (isset($_POST['fields'][$tv]) && $_POST['fields'][$tv] !== '') {
                          
                            $where[$tv] =$_POST['fields'][$tv];
                    }
                }
                
                // Добавляем это условие в параметры pdoPage "на лету"
                $_SESSION['pdoPage'][$hash]['where'] = $where;
                
                $output['message'] = $where;
                $output['success'] = true;
            } else {
                $output['message'] = 'Error';
            }
            echo $modx->toJSON($output);
            die();
            break;
        default:
            break;
    }
    И как добавить в фильтр еще один TV, для которого WHERE будет выполняться не через равенство, а через LIKE?
      Olga
      14 июня 2019, 11:37
      0
      Ребят, нет предложений/подсказок, как все-таки прописать условие <= для where?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.