Реализация фильтров в MODx Revo

Очень часто мне приходится реализовывать фильтры на сайтах, работающих на CMS MODx Revo. Будь-то это простые фильтры или фильтры для интернет-магазинов, принцип работы у них один и тот же. Нам необходимо создать сниппет «обертку» для вызова уже какого-либо другого сниппета. Это очень легко сделать, используя знания из предыдущей статьи (API MODX Revo)- приведу пример:

if ($_REQUEST['action']=='1'){
    $filter = '';
        // в строках ниже мы формируем строку фильтра в соответствии с документацией getResources
    if($_REQUEST['brand']!=''){
        foreach($_REQUEST['brand'] as $brand){
            //echo $brand;
            if ($filter=='') {
                $filter .= 'brand=='.$brand;
            }else {
                $filter .= '||brand=='.$brand;
            }
        }
    }
    if($_REQUEST['sost']!=''){
        foreach($_REQUEST['sost'] as $sost){
            if ($filter=='') {
                $filter .= 'sost=='.$sost;
            }else {
                $filter .= ',sost=='.$sost;
            }
        }
    }
    if($_REQUEST['price']!=''){
        $prices = explode(",",$_REQUEST['price']);
        if($filter==''){
            $filter .= 'price>='.$prices[0].',price<='.$prices[1];
        }else{
            $filter .= ',price>='.$prices[0].',price<='.$prices[1];
        }
    }
    // формируем параметры для сниппета pdoPage
    $params['parents'] = $id;
    $params['tpl'] = $tpl;
    $params['limit'] = '12';
    $params['element'] = 'getResources';
    $params['includeTVs'] = '1';
    $params['processTVs'] = '1';
    $params['hideContainers'] = '1';
    $params['sortbyTV'] = 'avaible';
    $params['sortdirTV'] = 'ASC';
        // проверяем есть ли фильтрация
    if ($filter != ''){
        $params['tvFilters'] = $filter;
    }
        // запускаем сниппет pdoPage
    $output = $modx->runSnippet('pdoPage', $params);
    echo $output; // выводим
 
}else{
    // формируем параметры для сниппета pdoPage
        $params['parents'] = $id;
    $params['tpl'] = $tpl;
    $params['limit'] = '12';
    $params['element'] = 'getResources';
    $params['includeTVs'] = '1';
    $params['processTVs'] = '1';
    $params['hideContainers'] = '1';
    $params['sortbyTV'] = 'avaible';
    $params['sortdirTV'] = 'ASC';
        // проверяем есть ли фильтрация
    if($filter!=''){
        $params['tvFilters'] = $filter;
    }
    // запускаем сниппет pdoPage
    $output = $modx->runSnippet('pdoPage', $params);
    echo $output; // выводим
}

Здесь, я думаю, все должно быть понятно. Вызов данного сниппета в шаблоне будет следующий:

<div class="product-list">
                     <div class="row no-margin">                       
                       [ [!filter? &id;=`[ [*id] ]` &tpl;=`listProductTpl`] ]
                     </div>
                   v/div>               
                   <div class="pagination-holder">
                     <div class="row">                       
                       <div class="col-xs-12 col-sm-12 text-left">
                         [ [!+page.nav] ]
                       </div>
                     </div>
                   </div>

Вызов у нас получился идентичный вызову простого pdoPage. Данная конструкция универсальна: ее можно использовать просто на страницах с пагинацией, так и с ajax подгрузкой. Про реализацию ajax в MODx Revo я расскажу в следующей статье.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *