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

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

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

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

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

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

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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();
?>
<?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(); ?>
<?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) будет выглядеть примерно так:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?>
<?foreach ($arResult['ITEMS'] as $item):?>
<!--вёрстка элемента инфоблока-->
<?endforeach;?>
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?> <?foreach ($arResult['ITEMS'] as $item):?> <!--вёрстка элемента инфоблока--> <?endforeach;?>
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?>
<?foreach ($arResult['ITEMS'] as $item):?>
<!--вёрстка элемента инфоблока-->
<?endforeach;?>

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