Стандартные фильтры в 1С Битрикс ограничены предопределёнными параметрами и не всегда соответствуют бизнес-логике проекта. Когда требуется точная настройка отбора данных, без собственного фильтра не обойтись. Например, необходимо фильтровать элементы инфоблока по значениям из пользовательских свойств или учитывать сложные условия с использованием связанных сущностей. В этой статье разберём, как создать фильтр, который действительно работает под ваши задачи.
Фильтрация данных в Битриксе строится на массиве условий, передаваемом в компонент или ORM-запрос. Ошибки на этом этапе приводят к некорректному отображению данных или к нулевому результату. Важно понимать структуру массива фильтра, синтаксис условий и способы их комбинирования. Мы рассмотрим, как подключить собственный фильтр в типовом компоненте, как внедрить его в пользовательский шаблон и как протестировать его корректность.
Также затронем нюансы работы с фильтрацией при использовании API D7, особенности фильтрации по множественным и привязанным свойствам, и покажем, как исключить SQL-инъекции при передаче параметров из формы. В процессе вы получите код, готовый к интеграции в любой проект на Битриксе.
Подключение собственного компонента фильтра в структуру сайта
После разработки собственного компонента фильтра, необходимо внедрить его в шаблон сайта или в определённую область страницы. Это обеспечит его работоспособность в рамках общей структуры Bitrix.
Откройте файл шаблона нужной страницы, например, catalog.section.php
или section.php
в директории /local/templates/название_шаблона/
. В месте, где должен отображаться фильтр, подключите компонент с помощью функции $APPLICATION->IncludeComponent
.
Пример подключения:
$APPLICATION->IncludeComponent(
"custom:smart.filter", // имя компонента
"", // шаблон компонента
array(
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "5",
"SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],
"FILTER_NAME" => "arrFilter",
"PRICE_CODE" => array("BASE"),
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000",
"SAVE_IN_SESSION" => "N"
),
false
);
Убедитесь, что переменная $arResult["VARIABLES"]["SECTION_ID"]
доступна в контексте страницы. При необходимости замените её на актуальную ID-секцию, полученную через API Bitrix.
Если используется ЧПУ, добавьте настройки SEF_MODE
и SEF_RULE
в параметры компонента, чтобы фильтр корректно обрабатывал URL.
Проверьте, чтобы фильтр был подключён до основного компонента списка товаров. Это важно, так как компонент списка должен получить массив отфильтрованных элементов, сформированных фильтром.
После подключения проверьте работу фильтра, изменяя параметры и наблюдая, как это влияет на отображение товаров. Ошибки можно диагностировать через включение отладки (SHOW_ERRORS
) или логирование содержимого массива $GLOBALS['arrFilter']
.
Настройка параметров компонента для передачи фильтрации
Для передачи фильтра в компонент Битрикс необходимо корректно определить параметр FILTER_NAME в массиве параметров при его подключении. Этот параметр указывает на имя переменной, содержащей массив условий фильтрации.
Пример подключения компонента с фильтром:
$APPLICATION->IncludeComponent(
"bitrix:news.list",
"",
array(
"IBLOCK_ID" => 5,
"FILTER_NAME" => "arrFilter",
"NEWS_COUNT" => "10",
"SORT_BY1" => "ACTIVE_FROM",
"SORT_ORDER1" => "DESC"
),
false
);?>
Перед подключением компонента создайте массив $arrFilter с нужными условиями. Например:
$arrFilter = array(
">DATE_ACTIVE_FROM" => ConvertTimeStamp(time() - 86400, "FULL"),
"PROPERTY_TYPE" => "catalog"
);
Если используется компонент с шаблоном, основанным на ajax-подгрузке, фильтр должен сохраняться в сессии или передаваться через POST/GET. В этом случае параметр FILTER_NAME должен ссылаться на глобальную переменную.
Для передачи фильтра через глобальную переменную добавьте:
global $arrFilter;
Важно: имя фильтра должно соответствовать только буквенно-цифровому формату, без спецсимволов. Использование нестандартных имен приведет к игнорированию фильтра компонентом.
Для фильтрации по свойствам инфоблока используйте префикс PROPERTY_ перед кодом свойства. Пример:
$arrFilter = array(
"PROPERTY_COLOR" => "red"
);
При использовании комплексного компонента (например, bitrix:news) параметр FILTER_NAME также должен быть указан в массиве LIST и SECTION, если фильтрация применяется на разных уровнях.
Создание пользовательской формы фильтра с использованием HTML и PHP
Для реализации фильтра с нуля необходимо создать HTML-форму и обработчик на PHP, взаимодействующий с API Битрикс. Пример будет основан на инфоблоке с элементами товаров.
Шаги по созданию:
- Создайте файл
filter.php
в корне компонента или в шаблоне сайта. - Опишите форму с методами
GET
илиPOST
, учитывая структуру данных:
<form method="GET" action="">
<input type="text" name="NAME" placeholder="Название товара">
<select name="SECTION_ID">
<option value="">Все разделы</option>
<?php
$sections = CIBlockSection::GetList(['NAME' => 'ASC'], ['IBLOCK_ID' => 5], false);
while ($section = $sections->GetNext()) {
echo '<option value="' . $section['ID'] . '">' . $section['NAME'] . '</option>';
}
?>
</select>
<input type="number" name="PRICE_FROM" placeholder="Цена от">
<input type="number" name="PRICE_TO" placeholder="Цена до">
<button type="submit">Фильтровать</button>
</form>
- Обработайте параметры фильтра на серверной стороне:
<?php
$filter = ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y'];
if (!empty($_GET['NAME'])) {
$filter['%NAME'] = $_GET['NAME'];
}
if (!empty($_GET['SECTION_ID'])) {
$filter['SECTION_ID'] = intval($_GET['SECTION_ID']);
}
if (!empty($_GET['PRICE_FROM']) || !empty($_GET['PRICE_TO'])) {
$priceFilter = [];
if (!empty($_GET['PRICE_FROM'])) {
$priceFilter['>=CATALOG_PRICE_1'] = floatval($_GET['PRICE_FROM']);
}
if (!empty($_GET['PRICE_TO'])) {
$priceFilter['<=CATALOG_PRICE_1'] = floatval($_GET['PRICE_TO']);
}
$filter = array_merge($filter, $priceFilter);
}
$res = CIBlockElement::GetList(['NAME' => 'ASC'], $filter, false, false, ['ID', 'NAME', 'DETAIL_PAGE_URL']);
while ($item = $res->GetNext()) {
echo '<p><a href="' . $item['DETAIL_PAGE_URL'] . '">' . $item['NAME'] . '</a></p>';
}
?>
Рекомендуется использовать фильтрацию через htmlspecialchars
и intval
/floatval
для защиты от инъекций. Также желательно применять компонент bitrix:catalog.filter
для интеграции с AJAX при необходимости.
Обработка данных фильтра на стороне компонента
После получения данных фильтра из формы или AJAX-запроса, компонент должен корректно обработать их перед использованием в выборке. В пользовательском компоненте необходимо реализовать метод onPrepareComponentParams(), чтобы валидировать и привести параметры фильтра к нужному формату.
Основные шаги обработки:
1. Проверка входных данных
Проверяйте типы и наличие обязательных полей. Например, для числовых значений используйте intval(), для строк – htmlspecialcharsbx() или strip_tags() в зависимости от контекста.
2. Формирование массива фильтра
Создавайте массив $arFilter в соответствии с API модуля CIBlockElement::GetList или ORM. Для диапазонов дат используйте ключи >=DATE_ACTIVE_FROM и <=DATE_ACTIVE_TO. Для точного совпадения – просто PROPERTY_COLOR, для подстроки – %NAME.
3. Интеграция с выборкой
Передавайте массив $arFilter непосредственно в метод получения данных. Например:
$arFilter = [
'IBLOCK_ID' => 5,
'ACTIVE' => 'Y',
'>=PROPERTY_PRICE' => 1000,
'<=PROPERTY_PRICE' => 5000,
'PROPERTY_COLOR' => 'RED'
];
$res = CIBlockElement::GetList([], $arFilter, false, false, $arSelect);
4. Кэширование
Учитывайте параметры фильтра при формировании ключей кеша. Это исключит повторный запрос с одними и теми же условиями:
if ($this->StartResultCache(false, $arFilter)) {
// выполнение выборки
$this->IncludeComponentTemplate();
}
5. Обработка нестандартных типов
Для множественных свойств и связанных сущностей используйте CIBlockElement::SubQuery или ORM-запросы с join. Это позволяет обрабатывать фильтрацию по связям и пользовательским полям.
Компонент должен оставаться устойчивым к ошибочным или отсутствующим параметрам. Логируйте критические случаи, чтобы упростить отладку.
Формирование массива фильтра для выборки элементов из инфоблока
Для получения выборки элементов из инфоблока в 1С-Битрикс используется массив фильтра, который передаётся в метод CIBlockElement::GetList
или CIBlockElement::GetListEx
. Формирование фильтра должно учитывать структуру инфоблока и тип данных, по которым производится отбор.
Основные ключи массива фильтра:
"IBLOCK_ID"
– обязательный параметр, указывающий ID инфоблока."ACTIVE"
– фильтрация по активности элемента. Обычно используется значение"Y"
."SECTION_ID"
– ID раздела инфоблока. При этом важно использовать ключ"INCLUDE_SUBSECTIONS"
для включения вложенных разделов."PROPERTY_<код_свойства>"
– фильтрация по пользовательским свойствам. Ключ формируется динамически на основе символьного кода свойства.">=DATE_ACTIVE_FROM"
,"<=DATE_ACTIVE_TO"
– фильтрация по диапазону дат активности.
Пример фильтра для выборки активных элементов из определённого раздела с заданным свойством и ограничением по дате:
$arFilter = [
"IBLOCK_ID" => 10,
"ACTIVE" => "Y",
"SECTION_ID" => 25,
"INCLUDE_SUBSECTIONS" => "Y",
"PROPERTY_TYPE" => "article",
">=DATE_ACTIVE_FROM" => ConvertTimeStamp(strtotime("-30 days"), "FULL"),
];
Для множественных свойств или фильтрации по нескольким значениям используется массив:
$arFilter = [
"IBLOCK_ID" => 12,
"ACTIVE" => "Y",
"PROPERTY_TAG" => ["news", "event", "promo"]
];
Если требуется исключить элементы с определёнными значениями, используйте оператор логического отрицания "!PROPERTY_"
:
$arFilter = [
"IBLOCK_ID" => 7,
"ACTIVE" => "Y",
"!PROPERTY_STATUS" => "archived"
];
Для числовых свойств допускаются операторы сравнения: >PROPERTY_PRICE
, <=PROPERTY_RATING
и др.
При работе с пользовательскими типами свойств (например, привязка к элементам, спискам или HTML-тексту) следует учитывать внутренние ID, а не отображаемые значения.
Интеграция фильтра с компонентом bitrix:news или catalog
Для эффективного взаимодействия фильтра с компонентами bitrix:news или bitrix:catalog необходимо учитывать несколько важных аспектов. Эти компоненты требуют правильной настройки параметров фильтра для корректной работы и отображения результатов.
Прежде чем интегрировать фильтр, убедитесь, что у вас настроены необходимые компоненты и блоки на страницах сайта. Для этого настройте компонент bitrix:news или bitrix:catalog в соответствии с требованиями проекта.
Основные шаги для интеграции фильтра:
- Создание фильтра: Начните с создания пользовательского фильтра, который будет использоваться для фильтрации новостей или товаров. Для этого в файле компонента укажите параметры фильтрации, такие как свойства, категории, даты и т.д.
- Настройка параметров фильтра: Важно определить, какие именно параметры будут фильтровать контент. Например, для компонента bitrix:catalog это могут быть такие параметры, как "Цены", "Бренд", "Цвет". Для компонента bitrix:news – "Дата публикации", "Автор", "Тема".
- Подключение фильтра к компоненту: Включите фильтр в шаблон компонента с помощью свойства
FILTER_NAME
. Укажите имя переменной фильтра, которое будет передаваться в компонент. Например,FILTER_NAME="arrFilter"
. - Передача данных в фильтр: Убедитесь, что данные фильтра передаются в запрос к базе данных. Для этого используйте компонент
bitrix:catalog.filter
для каталога или собственный фильтр для новостей. Параметры фильтра должны быть переданы в массив фильтра, который будет использован для выборки контента. - Оптимизация работы фильтра: Для увеличения скорости работы фильтра рекомендуется использовать индексирование базы данных по полям, которые используются в фильтре, а также ограничивать количество фильтруемых элементов для ускорения выполнения запросов.
Пример кода для подключения фильтра:
$APPLICATION->IncludeComponent( "bitrix:catalog.filter", ".default", array( "IBLOCK_TYPE" => "catalog", "IBLOCK_ID" => 1, "FILTER_NAME" => "arrFilter", "FIELD_CODE" => array("NAME", "PREVIEW_TEXT"), "PROPERTY_CODE" => array("PRICE", "BRAND"), ), false );
При интеграции с bitrix:news аналогичная структура используется для передачи параметров фильтра в компонент. Убедитесь, что параметры фильтра, такие как дата публикации или автор, соответствуют данным из вашего инфоблока.
Интеграция фильтра с компонентами bitrix:news и bitrix:catalog повышает удобство пользователя, позволяя ему быстро находить необходимую информацию, и улучшает общую производительность сайта.
Реализация сохранения значений фильтра при переходах по страницам
Чтобы обеспечить сохранение значений фильтра при переходах по страницам в 1С Битрикс, необходимо использовать механизм передачи параметров фильтра через URL и правильную их обработку на серверной стороне. Это позволяет пользователю сохранять настройки фильтра при навигации по страницам каталога.
Следующая страница
В данном примере параметры filter_color и filter_size будут переданы при переходе на страницу 2. Этот подход требует, чтобы на каждой странице фильтр передавался через URL.
На стороне серверной логики необходимо обработать переданные параметры и применить их к фильтру. В случае с компонентом списка товаров в Битрикс можно использовать класс CIBlockElement для получения данных с учетом фильтра. Например:
$_GET['filter_color'], "PROPERTY_SIZE" => $_GET['filter_size'] ); $res = CIBlockElement::GetList(array(), $filter); ?>
Такой код позволяет автоматически подставлять параметры фильтра при каждом запросе. Однако, для более сложных фильтров, например, с несколькими критериями, рекомендуется использовать встроенные функции Битрикс, такие как bitrix:catalog.section, которые поддерживают передачу фильтров через URL.
Не забывайте, что для удобства пользователя необходимо сохранить выбранные фильтры в сессии или куках. Это обеспечит сохранение фильтрации на всех страницах, а также после обновления страницы. Например, можно использовать следующий код для сохранения фильтров в сессии:
В случае с использованием сессии, при переходе на другую страницу фильтры будут доступны в глобальном массиве $_SESSION['filter']. Затем их можно использовать для фильтрации данных.
Для обеспечения долговечности настроек фильтра, можно комбинировать сессии и cookies. Например, сохранять значения фильтров в cookies, чтобы они не терялись при выходе пользователя из системы или закрытии браузера. Пример записи значений в cookies:
В дальнейшем, при каждом запросе, можно проверять наличие значений в cookies и автоматически восстанавливать их:
Этот метод позволяет добиться гибкости в сохранении и восстановлении фильтров, улучшая пользовательский опыт.
Отладка и тестирование фильтра в разных условиях использования
При создании фильтра в 1С Битрикс важно обеспечить его корректную работу в различных условиях. Это позволит предотвратить ошибки в работе пользователей и ускорить процесс поиска необходимой информации. Для эффективной отладки и тестирования фильтра необходимо учитывать несколько ключевых аспектов.
Прежде чем приступить к тестированию, убедитесь, что фильтр настроен корректно. Проверьте, что все поля и условия фильтрации соответствуют нужным значениям. Основные типы фильтров в Битрикс – это фильтры по свойствам элементов, категории, цене и дате. Для каждого из них следует подготовить несколько тестов, чтобы проверить их работоспособность в разных сценариях.
1. Тестирование фильтра на наличие ошибок в запросах
2. Тестирование на разных устройствах и браузерах
Фильтр должен работать одинаково корректно на различных устройствах. Проводите тестирование на мобильных и десктопных версиях, проверяя адаптивность интерфейса. Используйте инструменты разработчика в браузерах для проверки корректности отображения элементов и взаимодействия с фильтром на мобильных устройствах.
3. Тестирование на реальных данных
Примените фильтр на реальных данных, чтобы увидеть, как он работает при наличии большого количества записей. Проверьте, как фильтр обрабатывает различные комбинации параметров, включая редкие или экзотические значения. Тестирование на реальных данных позволяет выявить проблемы, которые не проявляются в условиях минимальных выборок.
4. Тестирование на кэшированных данных
Не забудьте проверить работу фильтра при включенном кэшировании. Некоторые фильтры могут не корректно обновлять данные при изменении условий поиска, если кэш не очищается. Используйте инструменты для мониторинга кэширования, чтобы убедиться, что при изменении фильтров данные отображаются корректно.
5. Тестирование производительности
Важно провести нагрузочное тестирование, чтобы понять, как фильтр влияет на производительность сайта при большом количестве пользователей. Используйте инструменты для оценки времени отклика и нагрузки на сервер при применении фильтра в условиях большого объема данных и одновременных запросов.
6. Тестирование фильтра на уникальные кейсы
Каждый сайт и его контент имеют свои особенности. Для этого необходимо создать уникальные сценарии использования фильтра. Например, тестирование работы с отрицательными значениями или фильтрация по несуществующим параметрам. Это позволит выявить нестандартные ошибки и улучшить взаимодействие с пользователем.
После завершения тестирования проведите повторную проверку всех функций, чтобы удостовериться в стабильности и корректности работы фильтра на всех этапах.
Вопрос-ответ:
Как создать собственный фильтр в 1С Битрикс?
Чтобы создать фильтр в 1С Битрикс, необходимо выполнить несколько шагов. Сначала откройте административную панель и перейдите в раздел «Настройки». Далее выберите категорию, для которой хотите создать фильтр (например, товары или новости). После этого добавьте необходимые поля фильтрации и настройте параметры отображения. Важно правильно настроить параметры для каждого поля, чтобы фильтрация данных работала корректно. После настройки фильтра сохраните изменения и протестируйте его работу на сайте.
Какие данные можно использовать для фильтрации в 1С Битрикс?
В 1С Битрикс можно использовать различные типы данных для создания фильтров. Это могут быть текстовые поля, даты, числовые значения, категории и элементы списка. Например, для товаров можно использовать фильтрацию по цене, бренду, цвету или размеру. Для новостей — по дате публикации или по рубрике. Важно правильно настроить типы данных, чтобы фильтр работал корректно, и чтобы пользователи могли легко найти нужную информацию.
Как изменить внешний вид фильтра на сайте?
Для изменения внешнего вида фильтра в 1С Битрикс необходимо отредактировать шаблон, который отвечает за отображение фильтра на сайте. Обычно это делается через систему управления контентом, где можно настроить CSS-стили и изменить HTML-код. Например, можно изменить расположение фильтра, изменить цвета, шрифты или добавить дополнительные элементы. Чтобы изменения были видны на сайте, не забудьте сохранить изменения и обновить кэш.
Можно ли создать несколько фильтров для одного раздела на сайте?
Да, в 1С Битрикс можно создать несколько фильтров для одного раздела. Это особенно полезно, если вам нужно предложить пользователю разные варианты сортировки или фильтрации контента, например, фильтры по цене, рейтингу или характеристикам товара. Для этого нужно добавить несколько фильтров в настройках раздела, а затем выбрать, какие из них будут отображаться на странице. Каждый фильтр можно настроить индивидуально, чтобы он соответствовал нуждам пользователей.
Как тестировать фильтр после его создания в 1С Битрикс?
После создания фильтра важно провести его тестирование, чтобы убедиться, что он работает корректно. Для этого нужно зайти на сайт и воспользоваться фильтром, проверив, правильно ли отображаются данные. Например, если вы создали фильтр по цене, проверьте, что товары с разной ценой отображаются правильно при изменении параметров фильтра. Также можно протестировать фильтр с разных устройств и браузеров, чтобы убедиться, что он работает без сбоев и отображается корректно на всех платформах.