Заготовка собственного компонента фильтра в Битрикс

Заготовку можно скачать отсюда.

Собственно не станем вдаваться в то, как этот фильтр будет выглядеть. Рассмотрим механику его работы.

Что должен делать фильтр? Правильно! Фильтровать информацию по различным параметрам.

Схема работы будет следующая:

Сама форма фильтра только отправляет POST запрос с параметрами фильтрации, а компонент вывода — на основе этих параметров выводит именно ту информацию, которая нам требуется.

component.php компонента вывода будет выглядеть примерно так:

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true){
    die();
}

CModule::IncludeModule("iblock");
$filter = array("IBLOCK_ID"=>/*ID инфоблока из которого нужно получить информацию*/, "ACTIVE"=>"Y");
$arResult = array();
/*
 * если в реквесте есть фильтрация
 */
if (!empty($_REQUEST['filter'])){
/* здесь добавляем в массив $filter параметры фильтрации из реквеста
 * пример:
 *if ((!empty($_REQUEST['filter']['PRICE_FROM']))AND(!empty($_REQUEST['filter']['PRICE_TO']))){
 *		$filter['>=PROPERTY_PRICE'] = $_REQUEST['filter']['PRICE_FROM'];
 *		$filter['<=PROPERTY_PRICE'] = $_REQUEST['filter']['PRICE_TO'];
 *	}
 */
}

/*
 * теперь выводим элементы инфоблока на основе фильтрационного массива $filter
 */
$arSelect = array(/*поля для вывода*/); 
$res = CIBlockElement::GetList(Array(/*сортировка*/), $filter, false, false, $arSelect);
while($ob = $res->GetNext()){
	// здесь обрабатываем наши данные для $arResult
	$arResult['ITEMS'][] = $ob;
}

//подключаем шаблон компонента
$this->IncludeComponentTemplate();
?>

В компонент вывода также можно добавить кэширование, но я не стал добавлять его в заготовку (вдруг кэширование вам не требуется?). Тоже самое касается параметров компонента — вполне можно вынести ID инфоблока в $arParams, но нужно ли это — решать Вам.

Заготовка шаблона вывода (template.php) будет выглядеть примерно так:

<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?>
<?foreach ($arResult['ITEMS'] as $item):?>
<!--вёрстка элемента инфоблока-->
<?endforeach;?>

Спасибо за внимание!