Очень часто мне приходится реализовывать фильтры на сайтах, работающих на 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 я расскажу в следующей статье.