Компонент 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"]);
Готово!
Спасибо за внимание!
Читайте свежий выпуск
«Кладовки программиста» каждый день!
Назад в раздел