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