+7 495 008 8452
  • Загрузка
Выберите ваш цвет

Как подключить торговые предложения к поиску по каталогу на «Битрикс»?

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


Компонент bitrix:catalog.search, или поиск в каталоге прекрасно помогает продажам. Но можно его усовершенствовать. Добавим возможность искать и получать в выдаче торговые предложения. Как именно?

1. Изучаем ситуацию

При детальном рассмотрении выясняется, что компонент осуществляет поиск по указанному инфоблоку при помощи bitrix:search.page, а затем выводит его элементы с помощью bitrix:catalog.section

<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?>
<?
$arElements = $APPLICATION->IncludeComponent("bitrix:search.page", ".default", Array( . . . "arrFILTER" => array(
        "iblock_" . $arParams["IBLOCK_TYPE"]
    ) ,
    "arrFILTER_iblock_" . $arParams["IBLOCK_TYPE"] => array(
        $arParams["IBLOCK_ID"]
    ) , . . .
) , $component);
if (!empty($arElements) && is_array($arElements)) {
    global $searchFilter;
    $searchFilter = array(
        "=ID" => $arElements,
    );
    $APPLICATION->IncludeComponent("bitrix:catalog.section", ".default", array(
        "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
        "IBLOCK_ID" => $arParams["IBLOCK_ID"],
        "FILTER_NAME" => "searchFilter", . . .
    ) , $arResult["THEME_COMPONENT"]);
}
else {
    echo GetMessage("CT_BCSE_NOT_FOUND");
}
?>


2. Расширяем область поиска

Нам требуется, чтобы компонент искал не только в инфоблоке каталога, но и в инфоблоке торговых предложений. Сначала отредактируем result_modifier.php, чтобы определить инфоблок торговых предложений

<?php if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?>
<?php
$arSKU = CCatalogSKU::GetInfoByProductIBlock($arParams["IBLOCK_ID"]);
if (is_array($arSKU)) {
    $arResult["ORLND"]["SKU_IBLOCK_ID"] = $arSKU["IBLOCK_ID"];
    $rsIBlock = CIBlock::GetByID($arSKU["IBLOCK_ID"]);
    if ($arIBlock = $rsIBlock->GetNext()) $arResult["ORLND"]["SKU_IBLOCK_TYPE"] = $arIBlock["IBLOCK_TYPE_ID"];
    $rsProperty = CIBlockProperty::GetByID($arSKU["SKU_PROPERTY_ID"], $arSKU["IBLOCK_ID"]);
    if ($arProperty = $rsProperty->GetNext()) $arResult["ORLND"]["SKU_PROPERTY_SID"] = $arProperty["CODE"];
}


3. Доработаем шаблон компонента template.php

Возможны два варианта. В более простом случае тип инфоблока торговых предложений совпадает с типами инфоблоков каталога

<?php
if (isset($arResult["ORLND"]["SKU_IBLOCK_ID"]) && isset($arResult["ORLND"]["SKU_IBLOCK_TYPE"]) && ($arResult["ORLND"]["SKU_IBLOCK_TYPE"] == $arParams["IBLOCK_TYPE"])) $arIBlockList = array(
    $arParams["IBLOCK_ID"],
    $arResult["ORLND"]["SKU_IBLOCK_ID"]
);
else $arIBlockList = array(
    $arParams["IBLOCK_ID"]
);
$arElements = array();
$arOffers = array();
?>
<div class="catalog-search">
<?php
$arElements = $APPLICATION->IncludeComponent("bitrix:search.page", ".default", array( . . . "arrFILTER" => array(
        "iblock_" . $arParams["IBLOCK_TYPE"]
    ) ,
    "arrFILTER_iblock_" . $arParams["IBLOCK_TYPE"] => $arIBlockList, . . .
) , $component);
?>


В более сложном случае тип не совпадает, и потребуется выполнять поиск по торговым предложениям отдельно.

<?php if (isset($arResult["ORLND"]["SKU_IBLOCK_TYPE"]) && ($arResult["ORLND"]["SKU_IBLOCK_TYPE"] != $arParams["IBLOCK_TYPE"])): ?>
<div style="display: none;">
<?php
    $arOffers = $APPLICATION->IncludeComponent("bitrix:search.page", ".default", array( . . . "arrFILTER" => array(
            "iblock_" . $arResult["ORLND"]["SKU_IBLOCK_TYPE"]
        ) ,
        "arrFILTER_iblock_" . $arResult["ORLND"]["SKU_IBLOCK_TYPE"] => array(
            $arResult["ORLND"]["SKU_IBLOCK_ID"]
        ) , . . .
    ) , $component);
?>
</div>
<?php
endif; ?>


И наконец, выполним фильтрацию результатов для bitrix:catalog.section.

<?php
if ((is_array($arElements) && !empty($arElements)) || (isset($arOffers) && is_array($arOffers) && !empty($arOffers))) {
    global $searchFilter;
    $searchFilter = array(
        "=ID" => $arElements
    );
    if (isset($arResult["ORLND"]["SKU_IBLOCK_ID"]) && isset($arResult["ORLND"]["SKU_PROPERTY_SID"])) {
        if (isset($arResult["ORLND"]["SKU_IBLOCK_TYPE"]) && ($arResult["ORLND"]["SKU_IBLOCK_TYPE"] == $arParams["IBLOCK_TYPE"])) {
            $searchFilter = array(
                array(
                    "LOGIC" => "OR",
                    array(
                        "=ID" => $arElements
                    ) ,
                    array(
                        "=ID" => CIBlockElement::SubQuery("PROPERTY_" . $arResult["ORLND"]["SKU_PROPERTY_SID"], array(
                            "IBLOCK_ID" => $arResult["ORLND"]["SKU_IBLOCK_ID"],
                            "=ID" => $arElements
                        ))
                    )
                )
            );
        }
        elseif (isset($arResult["ORLND"]["SKU_IBLOCK_TYPE"]) && ($arResult["ORLND"]["SKU_IBLOCK_TYPE"] != $arParams["IBLOCK_TYPE"]) && isset($arOffers)) {
            $searchFilter = array(
                array(
                    "LOGIC" => "OR",
                    array(
                        "=ID" => $arElements
                    ) ,
                    array(
                        "=ID" => CIBlockElement::SubQuery("PROPERTY_" . $arResult["ORLND"]["SKU_PROPERTY_SID"], array(
                            "IBLOCK_ID" => $arResult["ORLND"]["SKU_IBLOCK_ID"],
                            "=ID" => $arOffers
                        ))
                    )
                )
            );
        }
    }
    $APPLICATION->IncludeComponent("bitrix:catalog.section", ".default", array(
        "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
        "IBLOCK_ID" => $arParams["IBLOCK_ID"], . . . "FILTER_NAME" => "searchFilter", . . .
    ) , $arResult["THEME_COMPONENT"]);



Готово!


Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...