Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Компонент bitrix:catalog.search, или поиск в каталоге прекрасно помогает продажам. Но можно его усовершенствовать. Добавим возможность искать и получать в выдаче торговые предложения. Как именно?
1. Изучаем ситуацию
При детальном рассмотрении выясняется, что компонент осуществляет поиск по указанному инфоблоку при помощи bitrix:search.page, а затем выводит его элементы с помощью bitrix:catalog.section
2. Расширяем область поиска
Нам требуется, чтобы компонент искал не только в инфоблоке каталога, но и в инфоблоке торговых предложений. Сначала отредактируем result_modifier.php, чтобы определить инфоблок торговых предложений
3. Доработаем шаблон компонента template.php
Возможны два варианта. В более простом случае тип инфоблока торговых предложений совпадает с типами инфоблоков каталога
В более сложном случае тип не совпадает, и потребуется выполнять поиск по торговым предложениям отдельно.
И наконец, выполним фильтрацию результатов для bitrix:catalog.section.
Готово!
Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!
Назад в раздел
то ждем ваше обращение в нашей службе тех поддержки.
Компонент 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"]);
Готово!
Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!
Назад в раздел
Подписаться на новые материалы раздела: