Страница поиска с товарами. search.page + catalog.section

Компонент search.page


Введение

Данная статья описывает реализацию страницы поиска товаров в Битрикс с использованием компонентов search.page и catalog.section.

Решение позволяет организовать поиск по товарам каталога с последующим выводом результатов в виде каталога товаров.

Компонент search.page

Компонент search.page используется для организации поиска по сайту. В данном случае он настроен для поиска в инфоблоках каталога.

Параметры компонента:

<?$APPLICATION->IncludeComponent(
    "bitrix:search.page",
    "search_catalog",
    Array(
        "AJAX_MODE" => "N",
        "AJAX_OPTION_ADDITIONAL" => "",
        "AJAX_OPTION_HISTORY" => "N",
        "AJAX_OPTION_JUMP" => "N",
        "AJAX_OPTION_STYLE" => "Y",
        "CACHE_TIME" => "3600",
        "CACHE_TYPE" => "A",
        "CHECK_DATES" => "Y",
        "DEFAULT_SORT" => "rank",
        "DISPLAY_BOTTOM_PAGER" => "N",
        "DISPLAY_TOP_PAGER" => "N",
        "FILTER_NAME" => "",
        "NO_WORD_LOGIC" => "N",
        "PAGER_SHOW_ALWAYS" => "N",
        "PAGER_TEMPLATE" => "",
        "PAGER_TITLE" => "Результаты поиска",
        "PAGE_RESULT_COUNT" => "999",
        "PATH_TO_USER_PROFILE" => "",
        "RATING_TYPE" => "",
        "RESTART" => "Y",
        "SHOW_RATING" => "",
        "SHOW_WHEN" => "N",
        "SHOW_WHERE" => "N",
        "USE_LANGUAGE_GUESS" => "Y",
        "USE_SUGGEST" => "N",
        "USE_TITLE_RANK" => "Y",
        "arrFILTER" => array("iblock_1c_catalog"),
        "arrFILTER_iblock_1c_catalog" => array("22","23"),
        "arrWHERE" => array()
    )
);?>

Основные параметры:

  • arrFILTER - фильтр по типам инфоблоков

  • arrFILTER_iblock_1c_catalog - фильтр по конкретным инфоблокам каталога

  • PAGE_RESULT_COUNT - количество результатов на странице

  • DEFAULT_SORT - сортировка по релевантности

Модификатор результатов

В файле result_modifier.php происходит обработка результатов поиска:

$arResult['PRODUCT_IDS'] = [];
if (count($arResult['SEARCH'])) {
    foreach ($arResult['SEARCH'] as $key => &$arItem) {
        if ($arItem['PARAM1'] === '1c_catalog') {
            $arResult['PRODUCT_IDS'][] = $arItem['ITEM_ID'];
        }
    }
}

Здесь формируется массив ID найденных товаров, которые затем используются для фильтрации в компоненте catalog.section.

Шаблон вывода

В template.php реализована логика отображения результатов поиска:

  1. Получение информации о покупателе:

    use App\Customer;
    $customer = Customer::getCustomerInfo();
  2. Отображение количества найденных элементов

    $resCount = count($arResult['PRODUCT_IDS']);
    
    < ?
    // Отображаем кол-во найденных элементов.
    // Т.к. на данном проекте из 1С летят товары с нулевыми ценами,
    // то актуальное количество можно получить только из catalog.section ниже,
    // после выборки с фильтрацией по цене.
    // поэтому используем отложенные функции. Если это не нужно, пользуйтесь $resCount.
    if ($resCount > 0) { ? >
    	< div class="search-advanced">
    		< div class="search-advanced-result">
    			
    			< div class="search-result">
    				Найдено: ShowViewContent('count_catalog_result_search');?>
    			< /div>
    		< /div>
    	< /div>
    < ? } ?>

Основные параметры catalog.section:

  • Фильтрация по ID найденных товаров

  • Сортировка по цене

  • Настройки отображения товаров

  • Параметры пагинации

  • Настройки корзины

Особенности реализации

  1. Обработка нулевых цен: Реализация учитывает возможность наличия товаров с нулевыми ценами, которые приходят из 1С.

  2. Отложенный подсчет: Количество найденных элементов отображается с использованием отложенных функций.

  3. Интеграция с системой цен: Используется тип цены покупателя (\$customer['priceType']) для фильтрации и сортировки (несколько типов цен).

  4. Гибкая настройка отображения: Компонент catalog.section настроен с учетом различных параметров отображения товаров, включая:

    • Количество товаров на странице

    • Сортировку

    • Отображение цен

    • Настройки корзины

  5. Оптимизация производительности: Используется кеширование результатов поиска и каталога для повышения производительности.

Примечание

Если в проекте используется только один тип цены, логику с несколькими ценами можно упростить, удалив соответствующие параметры и настройки.