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