Всем привет!
Поскольку поиск товаров по ID является довольно актуальной проблемой, хотя и не очень сложной, я хочу поделиться с вами готовым решением.
Для начала проведем подготовительные работы. Битрикс по умолчанию не умеет искать по ID, поэтому нам надо создать в инфоблоке каталога пользовательское свойство, в котором мы будем хранить ID товара. Назовем это поле, например, SEARCH_ID. Теперь в настройках поля отмечаем, что оно участвует в поиске и сохраняем изменения.
Подготовка закончена, теперь надо заполнить поле для поиска по ID у уже созданных товаров, и автоматизировать его заполнение у вновь создаваемых.
Поехали!
Чтобы заполнить это поле для ваших тысяч товаров сохраните код ниже в файл, поменяйте в нем номер инфоблока и код поля для поиска по ID на ваши, загрузите файл на ваш сайт и откройте в браузере.
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); set_time_limit(0); //убираем ограничение на время выполнения скрипта CModule::IncludeModule("iblock"); CModule::IncludeModule("sale"); CModule::IncludeModule("catalog"); //введите сюда ID вашего инфоблока каталога $IBLOCK_ID = 5; //а сюда символьный код вашего поля для поиска по ID $SEARCH_FIELD_NAME = 'SEARCH_ID'; $els = CIBlockElement::GetList( array("SORT"=>"ASC"), array("IBLOCK_ID" => $IBLOCK_ID), false, false, array('ID','IBLOCK_ID') ); $cnt=0; while ($s = $els->Fetch()) { $ok = CIBlockElement::SetPropertyValuesEx( $s["ID"], $s['IBLOCK_ID'], array('SEARCH_ID' => $s["ID"]) ); if ($ok) { $cnt++; } } echo $cnt; require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>
Отлично! Поздравляю вы прошли первую часть квеста.
Теперь, чтобы не париться так каждый раз открывайте файл /bitrix/php_interface/init.php, создайте его если он отсутствует и добавьте в него следующий код. При необходимости замените SEARCH_ID на код вашего поля.
/* добавляем в поисковый индекс ID нового товара */ AddEventHandler("iblock", "OnAfterIBlockElementAdd", "searchid"); function searchid(&$arFields){ if($arFields["ID"]>0){ $upd = CIBlockElement::SetPropertyValuesEx( $arFields["ID"], $arFields['IBLOCK_ID'], array('SEARCH_ID' => $arFields["ID"]) ); } }
Ура! Вторая часть квеста пройдена.
Теперь вам надо в админке битрикса сделать полную переиндексацию, и поиск по ID должен начать работать у вас на сайте.
Квест пройден, забирайте принцессу/дракона/пиво/свой вариант (нужное подчеркнуть) и радуйтесь, очередной победе над CMS Bitrix.
Если остались вопросы или что-то пошло не так, пишите постараюсь помочь.
+1 спасибо за статью, все вышеизложенное работает, единственное дополнение — поставьте в первом файле set_time_limit(0), ибо часто кому понадобится на немалой БД выполнить…
Спасибо за совет, обновил статью.
А еще можно добавлять id в поисковый индекс самому:
AddEventHandler(«search», «BeforeIndex», «BeforeIndexHandler»);
function BeforeIndexHandler($arFields){
if($arFields[«PARAM1″]!=»catalog»)
return $arFields;
$arFields[«BODY»] .= PHP_EOL.$arFields[«ITEM_ID»];
return $arFields;
}
Вот вариант который сохраняет значения остальных св-ств, но при этом заполняет id, т.е. то что нужно, пользуйтесь на здоровье:
«ASC»),
Array(«IBLOCK_ID» => $IBLOCK_ID),
false
);
$cnt=0;
while ($s = $els->Fetch()) {
$ib = new CIBlockElement();
// Установим новое значение для данного свойства данного элемента
$dbr = CIBlockElement::GetList(array(), array(«=ID»=>$s[‘ID’]), false, false, array(«ID», «IBLOCK_ID»));
if ($dbr_arr = $dbr->Fetch()) {
$IBLOCK_ID = $dbr_arr[«IBLOCK_ID»];
CIBlockElement::SetPropertyValues($s[‘ID’], $IBLOCK_ID, $s[‘ID’], $SEARCH_FIELD_NAME);
$cnt++;
}
}
echo $cnt;
require($_SERVER[«DOCUMENT_ROOT»].»/bitrix/footer.php»);
?>
Спасибо!
Пожалуйста!
Спасибо автору, помогло!