Битрикс поиск по ID

Стандартно 1С-Битрикс не ищет по ID. Исправляем этот момент 🙂

Как в Битриксе искать по ID товара (элемента)?

Для поиска контента на сайте, обычно используют bitrix:search.title или компонент Поиск по заголовкам. Данный компонент (как несложно догадаться) ищет по названиям элементов, и выдает вам результат аяксом сразу же под поисковой строкой. В настройках вы можете ограничить область поиска выбрав нужные инфоблоки.

битрикс поиск

На моей практике, самый популярный случай это поиск по Каталогу, а точнее – по названию товара. Перейдем к реализации.

Шаг 1. Свойство в админке + init.php

Создадим в админке свойство с символьным кодом MYID и в настройках ставим галочку Значения свойства участвуют в поиске.

Теперь, переиндексируем все элементы. Для этого создаем страницу со следующим содержимым:

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");?>
<?
set_time_limit(0);
if (CModule::IncludeModule("iblock")):
	$res = CIBlockElement::GetList (
		false,
		Array("IBLOCK_ID" => 38, "ACTIVE" => "Y"),
		false,
		false,
		Array('ID', 'NAME', 'PROPERTY_MYID')
	);

	while($ar_field = $res->GetNext())
	{
		#Запись в MYID текущего ID
		if(!$ar_field['PROPERTY_MYID_VALUE']) {
			CIBlockElement::SetPropertyValuesEx($ar_field['ID'], false, array("MYID" => $ar_field['ID']));
			echo "<pre>Товар перезаписан - ".$ar_field['NAME']." - в значении ".$ar_field['ID']."</pre>";
		}


	}
echo 'Работа скрипта завершена';
endif;
?>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");?>

38 – ID вашего инфоблока с товарами. Мы записываем в свойство наш ID, если оно не задано. По этому свойству мы и будем искать. После того как скрипт выполнится, его можно удалить.

ПС – как вы видите, я в настройках фильтрации не указывал:

Array("IBLOCK_ID" => 38, "ACTIVE" => "Y", "!PROPERTY_MYID_VALUE" => false),

Хотя наверное стоило 🙂 .

Чтобы не вбивать в ручную ID, добавим в init.php следующий код:

/* добавляем в поисковый индекс ID нового товара */
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "searchid");
function searchid(&$arFields){
    if($arFields["ID"]>0){
        $upd = CIBlockElement::SetPropertyValuesEx(
            $arFields["ID"], 
            $arFields['IBLOCK_ID'], 
            array('MYID' => $arFields["ID"])
        );
    }
}

Это позволит при создании нового товара сразу же записывать его ID.
init.php это файл который создается в папке /bitrix/php_interface/

Шаг 2. Переиндексация

Теперь нам необходимо запустить переиндексацию. Делается это весьма просто:
http://ВАШ_САЙТ/bitrix/admin/search_reindex.php?lang=ru
ВАШ_САЙТ – вставляем домен и вуаля, вы на странице. Убираем галочку Переиндексировать только измененные и запускаем.

Шаг 3. Перенос компонента

На это шаге вам необходимо скачать компонент. Помещаем его в папку /bitrix/components/. Обратите внимание, что пространство имен компонента не bitrix а ready. К сожалению обычный компонент на рассчитан на поиск по другим свойствам, только по заголовкам.

<?$APPLICATION->IncludeComponent(
"ready:search.title",
..
?>

Надеюсь вы знаете, как в этот код добавить параметры и вызвать компонент 🙂 Для простоты, можно просто поменять в вашем search.title birix на ready. Зачем мы это делаем не в папке битрикс? Потому что при обновлении эти файлы могут обновиться, и в какой-то момент вы зададите себе вопрос “почему ничего не работает?” 🙂 .

Для самых любопытных оставляю ссылку на документацию.

Если на вашем сайте необходимо выполнить Поиск по id товара или элемента обращайтесь ко мне, помогу с настройкой

автор: Dmitriy

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

Email: dmitriyribka@gmail.com

5 коментаря

  1. Добрый день. Спасибо за статью, но вот такой вопрос. Когда мы создаем новый элемент каталога и заполняем у него свойство по которому планируем искать как вы описали, то в поисковый индекс это значение не попадает. Как быть быть с этой проблемой? Постоянно запускать переиндексацию полную?

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