Первая часть статьи обязательна к прочтению. В продолжении вы узнаете как расширить старый код до поиска по нескольким артикулам, часть которого вы ввели в строке.
Как искать товар по части артикула в Битриксе
Как и раньше, открываем папку с вашим шаблоном который может лежать как в папке bitrix так и в local. У меня это:
/bitrix/templates/next/components/bitrix/search.title/
где next – папка шаблона.
Заходим в шаблон fixed (для компонента search.title), ищем файл result_modifier.php и добавляем код в конец файла:
Посмотрим как поменялся код из первой части статьи, на новый:
if (!$arResult["SEARCH"] && is_numeric($arResult['query'])) { $arSelect = array( "ID", 'NAME', "IBLOCK_ID", "PREVIEW_TEXT", "PREVIEW_PICTURE", "DETAIL_PICTURE", "DETAIL_PAGE_URL", "ACTIVE_FROM", "PROPERTY_REDIRECT", "PROPERTY_CML2_ARTICLE" //'CATALOG_GROUP_1' ); $rsElements = CIBlockElement::GetList(array(), array('IBLOCK_ID' => 33, 'ACTIVE' => 'Y', 'PROPERTY_CML2_ARTICLE' => '%'.$arResult['query'].'%'), false, false, $arSelect); $b=0; while($arElement = $rsElements->GetNext()) { $price = CCatalogProduct::GetOptimalPrice($arElement['ID'], 1, $USER->GetUserGroupArray(), 'N'); if ($arElement["PREVIEW_PICTURE"] > 0) $arElement["PICTURE"] = CFile::ResizeImageGet($arElement["PREVIEW_PICTURE"], array("width"=>80, "height"=>80), BX_RESIZE_IMAGE_PROPORTIONAL, true); elseif ($arElement["DETAIL_PICTURE"] > 0) $arElement["PICTURE"] = CFile::ResizeImageGet($arElement["DETAIL_PICTURE"], array("width"=>80, "height"=>80), BX_RESIZE_IMAGE_PROPORTIONAL, true); $arElement["PRICE"] = number_format($price['RESULT_PRICE']['DISCOUNT_PRICE'], 0, '', ' '); $arResult["FIND_ARTNUMBER"][$b] = $arElement; $b++; } }
Что изменилось
– в выборку полей arSelect добавили свойство с артикулом, позже вы узнаете зачем – PROPERTY_CML2_ARTICLE
– теперь мы собираем в массив вместо 1 найденного товара
– поисковая строка теперь выглядит вот так ‘PROPERTY_CML2_ARTICLE’ => ‘%’.$arResult[‘query’].’%’ – что означает, искать везде, как в начале, так и в середине, так и в самом конце артикула (поиск по маске, не точное вхождени)
Напоминаю, поиск по артикулу начинает работать только если не найдены товары по имени – если вас это не устраивает, переписывайте 🙂
Часть 2. Меняем файл ajax.php и заменяем начало файла на:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();?> <?if (!empty($arResult['FIND_ARTNUMBER'][0])) {?> <div class="bx_searche scrollbar"> <?foreach($arResult['FIND_ARTNUMBER'] as $item) {?> <a class="bx_item_block" href="<?=$item["DETAIL_PAGE_URL"]?>"> <div class="maxwidth-theme"> <div class="bx_img_element"> <?if(is_array($item["PICTURE"])):?> <img src="<?=$item["PICTURE"]["src"]?>"> <?else:?> <img src="<?=SITE_TEMPLATE_PATH?>/images/no_photo_small.png" width="38" height="38"> <?endif;?> </div> <div class="bx_item_element"> <span><?=$item["NAME"]?> <span class="art-number-block">Артикул: <b><?=$item['PROPERTY_CML2_ARTICLE_VALUE']?></b></span></span> <div class="price cost prices"> <div class="title-search-price"> <div class="price"><?=$item['PRICE']?> руб.</div> </div> </div> </div> <div style="clear:both;"></div> </div> </a> <?}?> </div> <?}?>
Помните, мы добавляли в выборку артикул – так вот, теперь вы сможете выделять товары, если нашлись по артикулу:
<span><?=$item["NAME"]?> <span class="art-number-block">Артикул: <b><?=$item['PROPERTY_CML2_ARTICLE_VALUE']?></b></span></span>
Проверку на поле делать не надо, т.к. по нему и идет поиск. В целом, в этом файле проверяем есть ли первый элемент массива (который начинается с 0), и затем запускаем foreach для того чтобы пройтись по циклу и вывести все результаты.
Надеюсь вам понравились эти 2 части статьи, и у вас всё получилось.
Приветствую! Как добавить поиск по тегам (кот. в карточке товара, вкладка SEO, свойство теги) ?
Пишу: Array(“CODE” => “CML2_ARTICLE”,”PROPERTY_tags”)), либо просто tags, делаю переиндексацию, не помогает. Буду крайне признателен за помощь?
А где вы в моем коде увидели запись через array(“CODE” => …?