В данной статье детально разберем кастомизацию кода из готового решения.
Поиск по артикулу в 1С-Битрикс
Если вы еще не знакомы со статьей поиск по ID, как говорится, “прошу к столу” . Ну а сегодняшняя тема, поиск по артикулу на примере компонента search.title (тестировал на готовом решении, имя которого начинается на “А” и заканчивается на “СПРО” 🙂 ).
Открываем папку с вашим шаблоном который может лежать как в папке 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", //'CATALOG_GROUP_1' ); $rsElements = CIBlockElement::GetList(array(), array('IBLOCK_ID' => 33, 'ACTIVE' => 'Y', 'PROPERTY_CML2_ARTICLE' => $arResult['query']), false, false, $arSelect); if($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"] = $arElement; } }
Если вкратце, то нам необходимо убедится что поиск ничего не нашел и то, что мы ввели, является числом (внимание, если у вас артикул не числовой, вам необходимо убрать эту проверку и возможно придумать свою, например, начинается на ART_). После этого, из информационного блока 33 (ВАЖНО, поменяйте на свой ID инфоблока товаров), ищем товар, свойство которого соответствует CML2_ARTICLE (свойства записываем через PROPERTY_CML2_ARTICLE).
С остальным я думаю ясно, записываем имя, ссылку (которая генерируется в настройках инфоблока по формуле), ресайзим картинку из анонса или детальной (если ее не существует) и ищем актуальную цену при помощи:
$price = CCatalogProduct::GetOptimalPrice($arElement['ID'], 1, $USER->GetUserGroupArray(), 'N');
а затем записываем цену со скидкой, добавив пробел в тысячных величинах:
$arElement["PRICE"] = number_format($price['RESULT_PRICE']['DISCOUNT_PRICE'], 0, '', ' ');
Закрываем файл, но перед этим, чтобы убедится что у вас всё работает, можете принтануть результат прямо тут (при помощи print_r или var_dump).
Часть 2. Открываем тут же файл ajax.php и заменяем начало файла на:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();?> <?if (!empty($arResult['FIND_ARTNUMBER'])) {?> <div class="bx_searche scrollbar"> <a class="bx_item_block" href="<?=$arResult['FIND_ARTNUMBER']["DETAIL_PAGE_URL"]?>"> <div class="maxwidth-theme"> <div class="bx_img_element"> <?if(is_array($arResult['FIND_ARTNUMBER']["PICTURE"])):?> <img src="<?=$arResult['FIND_ARTNUMBER']["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><?=$arResult['FIND_ARTNUMBER']["NAME"]?></span> <div class="price cost prices"> <div class="title-search-price"> <div class="price"><?=$arResult['FIND_ARTNUMBER']['PRICE']?> руб.</div> </div> </div> </div> <div style="clear:both;"></div> </div> </a> </div> <?}?>
По сути, мы проверяем есть ли у нас данные по товару, и выводим их в читаемом виде, вёрстку и массивы можете переделывать кому как удобно.
В результате получаем:
Надеюсь у вас всё получилось.
Важно – решение не универсальное, и по какой-то причине может не работать на вашем сайте, но данная статья может натолкнуть вас на реализацию данной задачи (на одну из реализаций данной задачи 😉 ).
Часть 2 уже вышла, и вы можете ее почитать – усовершенствуем код.
А при переиндексации не добавить артикул в поисковой индекс?
Можно и так. Создаем свойство артикул, отмечаем что оно учавстствует в поиске, переиндексируем, и, как правило, поиск по нему ищет.