Стандартно 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. Зачем мы это делаем не в папке битрикс? Потому что при обновлении эти файлы могут обновиться, и в какой-то момент вы зададите себе вопрос “почему ничего не работает?” 🙂 .
Для самых любопытных оставляю ссылку на документацию.
В архиве с компонентом ready.search.title.zip лежит другой компонент price.list. И какой тогда смысл в этой публикации?
Александр, спасибо что заметили, архив обновлен 🙂
Добрый день. Спасибо за статью, но вот такой вопрос. Когда мы создаем новый элемент каталога и заполняем у него свойство по которому планируем искать как вы описали, то в поисковый индекс это значение не попадает. Как быть быть с этой проблемой? Постоянно запускать переиндексацию полную?
вручную не самый лучший вариант. в идеале – сделать переиндексацию по расписанию, например раз в час
Я думаю над тем, как тут же переиндексировать этот элемент с помощью csearch::Index. Но пока что-то ничего толкового не вышло.