Для поиска по каталогу товаров на сайте используем компонент «Поиск по каталогу» (bitrix:catalog.search). Компонент выводит результаты поиска по элементам каталога с указанным набором свойств, цен и т.д., является стандартным. В качестве параметров компоненту указываются тип инфо-блоков и ID инфобока, по которому будет производится поиск. http://dev.1c-bitrix.ru/user_help/con...search.php
Но выяснилась одна очень важная деталь, при поиске по свойствам/описанию торговых предложений, компонент их не выводит. Рассмотрев детально код (основной код компонента сосредоточен в шаблоне), выяснили, что компонент выполняет поиск по заданному инфоблоку поисковой фразы с помощью bitrix:search.page, а затем выводит элементы инфоблока с помощью bitrix:catalog.section.
Немного подправив код, можно указать компоненту bitrix:search.page, что искать нужно не только в инфоблоке основного каталога товаров, но и в инфоблоке торговых предложений. Т. к. для вывода товарных позиций в bitrix:catalog.section необходимо указывать ID элемента торгового каталога, то для торговых предложений необходимо выполнить дополнительно подзапрос к инфоблоку торговых предложений.
Для этого сначала в файле result_modifier.php с помощью метода CCatalogSKU::GetInfoByProductIBlock() определяем наличие инфоблока торговых предложений и его параметры. Определяем тип этого инфоблока и по идентификатору свойства-связки символьный код этого свойства.
<?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"];
}
Получается, что массив arResult пополняется новыми полями:
Теперь модифицируем template.php. В случае, если типы инфоблоков торгового каталога и торговых предложений совпадают, формируется массив из идентификаторов этих инфоблоков.
Таким образом, мы с помощью подзапроса CIBlockElement::SubQuery() получаем элементы основного каталога товаров, торговые предложения которых были найдены.
Обновил примеры кода, т. к. выяснилось, что если нет результатов поиска по основному инфоблоку, то результаты поиска по торговым предложениям вообще не выводятся. Теперь, по идее, всё должно работать корректно.
Спасибо большое. вот так и не догадаешься, что стандартно это не работает. а еще не забываем в инфоблоке торговых предложений настраивать ЧПУ #PRODUCT_URL# - а то у меня удалено это было
Мне нужен поиск только по Названию или артикулу. Я подумал, что проще, в момент создания или редактирования товара, просто записать артикулы в свойство товара с ТП. Создать например ['SKU_ARTNUMBERS'] и туда записывать артикулы через пробел, и индексировать для поиска.
Тогда: 1. Меньше запросов при рендере шаблонов. 2. Не будет проблем с пагинацией, т.к. способ описанный в статье мне кажется сулит проблемами с пагинацией.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».