Всем привет!

Поскольку поиск товаров по 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.

Если остались вопросы или что-то пошло не так, пишите постараюсь помочь.

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

7 комментариев к “Битрикс поиск товара по ID

  • 03.12.2012 в 22:13
    Постоянная ссылка

    +1 спасибо за статью, все вышеизложенное работает, единственное дополнение — поставьте в первом файле set_time_limit(0), ибо часто кому понадобится на немалой БД выполнить…

    Ответ
  • 14.12.2012 в 13:15
    Постоянная ссылка

    А еще можно добавлять id в поисковый индекс самому:

    AddEventHandler(«search», «BeforeIndex», «BeforeIndexHandler»);
    function BeforeIndexHandler($arFields){
    if($arFields[«PARAM1″]!=»catalog»)
    return $arFields;
    $arFields[«BODY»] .= PHP_EOL.$arFields[«ITEM_ID»];
    return $arFields;
    }

    Ответ
  • 18.04.2013 в 09:30
    Постоянная ссылка

    Вот вариант который сохраняет значения остальных св-ств, но при этом заполняет 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»);
    ?>

    Ответ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

90% сайтов рунета содержат уязвимости и могут быть взломаны! Проверь свой сайт!