Поиск элементов с дополнительной фильтрацией по любым параметрам - Сергей Житников: Web-разработчик

Поиск элементов с дополнительной фильтрацией по любым параметрам

С версии модуля поиска 10.0.0 появилась возможность сортировать результат с учетом раздела элемента, и (или) значения любого свойства элемента, или других произвольных параметров (совершенно любых, например символьный код или размер изображения на PREVIEW_PICTURE). Реализация всегда примерно одна и та же — для любого дополнения в поиске.

Логика настройки поиска с фильтрацией по произвольным параметрам

По пунктам, как настроить функционал на примере фильтрации по разделам элемента и значения списочного свойства «Статус аукциона» (выделен на скрине выше):

  • Зарегистрируем обработчик события, которое сработает при переиндексации поиска:
//файл /bitrix/php_interface/init.php
use Bitrix\Main\EventManager;
$handler = EventManager::getInstance();
$handler->AddEventHandler("search", "BeforeIndex", ["Ml\Events\Search", "BeforeIndexHandler"]);
  • Напишем класс и метод для обработки события
<?php
namespace Ml\Events;

class Search
{
    public static function BeforeIndexHandler(&$arFields)
    {
        if($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == IB_CATALOG_ID && substr($arFields["ITEM_ID"], 0, 1) != "S")
        {
            $lot = new Lot($arFields['ITEM_ID']); //Получаем значение свойства элемента
            $statusId = $lot->getCurrentStatusId();//Получаем значение свойства элемента

            $arFields["PARAMS"]["iblock_section"] = array();
            $rsSections = \CIBlockElement::GetElementGroups($arFields["ITEM_ID"], true); //Получаем разделы привязки элемента (их может быть несколько)
            
            while($arSection = $rsSections->Fetch())
            {
                $arFields["PARAMS"]["iblock_section"][] = $arSection["ID"]; //Добавляем раздел, в котором лежит элемент, в параметры
                $arFields["PARAMS"]["auction_status"][] = $statusId; //Добавляем любое другое свойство или значение, по которому также будет осуществляться дополнительная фильтрация в поиске
            }
        }
        //Всегда возвращаем arFields
        return $arFields;
    }
}
  • Для запуска события, которое мы описали, пересохраняем элемент из инфоблока IB_CATALOG_ID и подходящего по другим условиям, описанным в коде выше. Или запускаем переиндексацию поиска.
  • После переиндексации, в таблице b_search_content_param можно будет увидеть добавленные значения для дополнительной фильтрации элементов, найденных в поиске. Прямо постучаться в табличку и глянуть что там, можно по ссылке в админку «/bitrix/admin/perfmon_table.php?lang=ru&set_filter=Y&table_name=b_search_content_param&find_type=SEARCH_CONTENT_ID».
  • На странице вызова компонента bitrix:search.page необходимо определить глобальную переменную и закинуть в нее параметры, которые мы прокидываем в GET-запросе. Несущественные параметры компонента я опустил
<?
$request = Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$sectionId = $request->getQuery("category_id");
$statusId = $request->getQuery("auction_status"); //получаем в GET параметре еще одно значение, по которому также будем сортировать

if($sectionId)	$GLOBALS['arSectionFilter']['PARAMS']["iblock_section"] = $sectionId;
if($statusId)	$GLOBALS['arSectionFilter']['PARAMS']["auction_status"] = $statusId; //Закидываем в глобальную переменную нужные нам значения для фильтрации по этому свойству элементов из поиска
?>

<?$APPLICATION->IncludeComponent(
	"ml:search.page",
	"custom_search_page",
	array(
		"RESTART" => "N",
		"FILTER_NAME" => "arSectionFilter",
...
	),
	false
);?>

Принципиально важно определять $arSectionFilter, по которой будем фильтровать элементы, не через global $arSectionFilter, а через $GLOBALS[‘arSectionFilter’]. Иначе не отработает.

Сергей Житников
Об авторе

Сергей Житников - Веб-разработчик

Занимаюсь веб-разработкой более 5 лет. Специализируюсь на создании адаптивных сайтов и веб-приложений на HTML5, CSS3 и JavaScript. Работаю с популярными CMS и фреймворками, а также уделяю большое внимание оптимизации производительности и чистоте кода.

Есть проект или идея? Буду рад помочь!

Связаться со мной

Последние статьи

19.06.2026
В статье собрал шпаргалку по основным компонентам Bitrix: bitrix:menu, news.list, news.detail, sale.basket.basket.line, main.include и breadcrumb. Разобрал настройку меню из разделов и элементов инфоблока через файлы .menu_ext.php, показываю полные конфигурации компонентов с пояснениями ключевых параметров. Готовые примеры для быстрого копирования и использования в проектах.
19.06.2026
Купоны в Битрикс неразрывно связаны с правилами работы с корзиной — без привязки к правилу они не сработают, а правило без купонов применит скидку на все товары. Разбираю создание купонов через DiscountCouponTable::add(): обязательные и опциональные поля, типы купонов, флаги активности. Показываю примеры работы с датами через объект DateTime (прибавление дней, месяцев и минут).
19.06.2026
Разбираю готовые примеры работы с изображениями в PHP: сохранение на сервер, вывод в браузер, рисование линий и прямоугольников. Отдельно — нюансы с форматами файлов (JPEG/PNG) и поддержкой кириллицы через шрифты.