Битрикс поиск по артикулу Часть 2 (по любой части артикула)

Первая часть статьи обязательна к прочтению. В продолжении вы узнаете как расширить старый код до поиска по нескольким артикулам, часть которого вы ввели в строке.

Как искать товар по части артикула в Битриксе

Как и раньше, открываем папку с вашим шаблоном который может лежать как в папке 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 части статьи, и у вас всё получилось.

Если на вашем сайте нужно усовершенствовать поиск, добавить поиск по другим свойствам товара, ID или артикулу, обращайтесь ко мне за помощью

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

2 коментаря

  1. Приветствую! Как добавить поиск по тегам (кот. в карточке товара, вкладка SEO, свойство теги) ?
    Пишу: Array(“CODE” => “CML2_ARTICLE”,”PROPERTY_tags”)), либо просто tags, делаю переиндексацию, не помогает. Буду крайне признателен за помощь?

Залишити відповідь