Bitrix catalog search php

Варианты решения: поиск по каталогу, включая торговые предложения.

Для поиска по каталогу товаров на сайте используем компонент «Поиск по каталогу» (bitrix:catalog.search). Компонент выводит результаты поиска по элементам каталога с указанным набором свойств, цен и т.д., является стандартным. В качестве параметров компоненту указываются т ип инфо-блоков и ID инфобока, по которому будет производится поиск.
http://dev.1c-bitrix.ru/user_help/con. search.php

Но выяснилась одна очень важная деталь, при поиске по свойствам/описанию торговых предложений, компонент их не выводит. Рассмотрев детально код (основной код компонента сосредоточен в шаблоне), выяснили, что компонент выполняет поиск по заданному инфоблоку поисковой фразы с помощью bitrix:search.page, а затем выводит элементы инфоблока с помощью bitrix:catalog.section.

 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"); >?>

Немного подправив код, можно указать компоненту bitrix:search.page, что искать нужно не только в инфоблоке основного каталога товаров, но и в инфоблоке торговых предложений. Т. к. для вывода товарных позиций в bitrix:catalog.section необходимо указывать ID элемента торгового каталога, то для торговых предложений необходимо выполнить дополнительно подзапрос к инфоблоку торговых предложений.

Для этого сначала в файле result_modifier.php с помощью метода CCatalogSKU::GetInfoByProductIBlock() определяем наличие инфоблока торговых предложений и его параметры. Определяем тип этого инфоблока и по идентификатору свойства-связки символьный код этого свойства.

 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"]; >
array(2) < . ["ORLND"]=>array(3) < ["SKU_IBLOCK_ID"]=>int(. ) ["SKU_IBLOCK_TYPE"]=> string(8) ". " ["SKU_PROPERTY_SID"]=> string(9) ". " > >

Теперь модифицируем template.php. В случае, если типы инфоблоков торгового каталога и торговых предложений совпадают, формируется массив из идентификаторов этих инфоблоков.

  IncludeComponent("bitrix:search.page", ".default", array( . "arrFILTER" => array("iblock_" . $arParams["IBLOCK_TYPE"]), "arrFILTER_iblock_" . $arParams["IBLOCK_TYPE"] => $arIBlockList, . ), $component ); ?>
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 ); ?>
 $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"] ); >

Таким образом, мы с помощью подзапроса CIBlockElement::SubQuery() получаем элементы основного каталога товаров, торговые предложения которых были найдены.

Источник

Поиск по каталогу

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

В визуальном редакторе компонент расположен по пути Контент > Каталог > Поиск по каталогу.

Компонент относится к модулю Информационные блоки.

Параметры

  • shows – по количеству просмотров в среднем;
  • sort – по индексу сортировки;
  • timestamp_x – по дате изменения;
  • name – по названию;
  • id – по идентификатору;
  • active_from – по дате активности с;
  • active_to – по дате активности по;
  • SCALED_PRICE_[ID] – по типу цен (вместо [ID] — идентификатор типа цены)
  • по возрастанию;
  • по убыванию;
  • другое.
  • shows – по количеству просмотров в среднем;
  • sort – по индексу сортировки;
  • timestamp_x – по дате изменения;
  • name – по названию;
  • id – по идентификатору;
  • active_from – по дате активности с;
  • active_to – по дате активности по;
  • SCALED_PRICE_[ID] – по типу цен (вместо [ID] — идентификатор типа цены)
  • по возрастанию;
  • по убыванию;
  • другое.
  • Отображать в общем списке
  • Отображать в конце
  • Не отображать
  • не отображать;
  • отображать только с возможностью подписки;
  • отображать все.
  • A — Авто + Управляемое: автоматически обновляет кеш компонентов в течение заданного времени или при изменении данных;
  • Y — Кешировать: для кеширования необходимо определить время кеширования;
  • N — Не кешировать: кеширования нет в любом случае.

Пример вызова

IncludeComponent ( "bitrix:catalog.search", "", Array( "AJAX_MODE" => "Y", "IBLOCK_TYPE" => "catalog_tovar", "IBLOCK_ID" => "8", "ELEMENT_SORT_FIELD" => "sort", "ELEMENT_SORT_ORDER" => "asc", "ELEMENT_SORT_FIELD2" => "id", "ELEMENT_SORT_ORDER2" => "desc", "SECTION_URL" => "", "DETAIL_URL" => "", "BASKET_URL" => "/personal/basket.php", "ACTION_VARIABLE" => "action", "PRODUCT_ID_VARIABLE" => "id", "PRODUCT_QUANTITY_VARIABLE" => "quantity", "PRODUCT_PROPS_VARIABLE" => "prop", "SECTION_ID_VARIABLE" => "SECTION_ID", "DISPLAY_COMPARE" => "Y", "PAGE_ELEMENT_COUNT" => "30", "LINE_ELEMENT_COUNT" => "3", "PROPERTY_CODE" => array(), "OFFERS_FIELD_CODE" => array(), "OFFERS_PROPERTY_CODE" => array(), "OFFERS_SORT_FIELD" => "sort", "OFFERS_SORT_ORDER" => "asc", "OFFERS_SORT_FIELD2" => "id", "OFFERS_SORT_ORDER2" => "desc", "OFFERS_LIMIT" => "5", "PRICE_CODE" => array("BASE"), "USE_PRICE_COUNT" => "Y", "SHOW_PRICE_COUNT" => "1", "PRICE_VAT_INCLUDE" => "Y", "USE_PRODUCT_QUANTITY" => "Y", "CACHE_TYPE" => "A", "CACHE_TIME" => "36000000", "RESTART" => "Y", "NO_WORD_LOGIC" => "Y", "USE_LANGUAGE_GUESS" => "Y", "CHECK_DATES" => "Y", "DISPLAY_TOP_PAGER" => "Y", "DISPLAY_BOTTOM_PAGER" => "Y", "PAGER_TITLE" => "Товары", "PAGER_SHOW_ALWAYS" => "Y", "PAGER_TEMPLATE" => "", "PAGER_DESC_NUMBERING" => "Y", "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000", "PAGER_SHOW_ALL" => "Y", "HIDE_NOT_AVAILABLE" => "N", "CONVERT_CURRENCY" => "Y", "CURRENCY_ID" => "RUB", "OFFERS_CART_PROPERTIES" => array(), "AJAX_OPTION_JUMP" => "Y", "AJAX_OPTION_STYLE" => "Y", "AJAX_OPTION_HISTORY" => "Y" ) );?>

Источник

Поиск по каталогу, включая торговые предложения

Варианты решения: поиск по каталогу, включая торговые предложения.

Для поиска по каталогу товаров на сайте используем компонент «Поиск по каталогу» (bitrix:catalog.search). Компонент выводит результаты поиска по элементам каталога с указанным набором свойств, цен и т.д., является стандартным. В качестве параметров компоненту указываются т ип инфо-блоков и ID инфобока, по которому будет производится поиск.
http://dev.1c-bitrix.ru/user_help/con. search.php

Но выяснилась одна очень важная деталь, при поиске по свойствам/описанию торговых предложений, компонент их не выводит. Рассмотрев детально код (основной код компонента сосредоточен в шаблоне), выяснили, что компонент выполняет поиск по заданному инфоблоку поисковой фразы с помощью bitrix:search.page, а затем выводит элементы инфоблока с помощью bitrix:catalog.section.

 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"); >?>

Немного подправив код, можно указать компоненту bitrix:search.page, что искать нужно не только в инфоблоке основного каталога товаров, но и в инфоблоке торговых предложений. Т. к. для вывода товарных позиций в bitrix:catalog.section необходимо указывать ID элемента торгового каталога, то для торговых предложений необходимо выполнить дополнительно подзапрос к инфоблоку торговых предложений.

Для этого сначала в файле result_modifier.php с помощью метода CCatalogSKU::GetInfoByProductIBlock() определяем наличие инфоблока торговых предложений и его параметры. Определяем тип этого инфоблока и по идентификатору свойства-связки символьный код этого свойства.

 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"]; >
array(2) < . ["ORLND"]=>array(3) < ["SKU_IBLOCK_ID"]=>int(. ) ["SKU_IBLOCK_TYPE"]=> string(8) ". " ["SKU_PROPERTY_SID"]=> string(9) ". " > >

Теперь модифицируем template.php. В случае, если типы инфоблоков торгового каталога и торговых предложений совпадают, формируется массив из идентификаторов этих инфоблоков.

  IncludeComponent("bitrix:search.page", ".default", array( . "arrFILTER" => array("iblock_" . $arParams["IBLOCK_TYPE"]), "arrFILTER_iblock_" . $arParams["IBLOCK_TYPE"] => $arIBlockList, . ), $component ); ?>
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 ); ?>
 $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"] ); >

Таким образом, мы с помощью подзапроса CIBlockElement::SubQuery() получаем элементы основного каталога товаров, торговые предложения которых были найдены.

Источник

Читайте также:  Import from local file python
Оцените статью