juniorcoder
@juniorcoder
Ура, у нас новый умный AI...

Как сделать поиск по свойству в Битрикс search.title?

В файл /bitrix/php_interface/init.php добавил поиск по артикулу, как сюда еще одно свойство добавить, например штрихкод?
// регистрируем обработчик
AddEventHandler("search", "BeforeIndex", "BeforeIndexHandler");
 // создаем обработчик события "BeforeIndex"
function BeforeIndexHandler($arFields)
{
   if(!CModule::IncludeModule("iblock")) // подключаем модуль
      return $arFields;
   if($arFields["MODULE_ID"] == "iblock")
   {
      $db_props = CIBlockElement::GetProperty(                        // Запросим свойства индексируемого элемента
                                    $arFields["PARAM2"],         // BLOCK_ID индексируемого свойства
                                    $arFields["ITEM_ID"],          // ID индексируемого свойства
                                    array("sort" => "asc"),       // Сортировка (можно упустить)
                                    Array("CODE"=>"CML2_ARTICLE")); // CODE свойства (в данном случае артикул)
      if($ar_props = $db_props->Fetch())
         $arFields["TITLE"] .= " ".$ar_props["VALUE"];   // Добавим свойство в конец заголовка индексируемого элемента
   }
   return $arFields; // вернём изменения
}
  • Вопрос задан
  • 8167 просмотров
Пригласить эксперта
Ответы на вопрос 2
@kudis
Bitrix developer
В Вашем решении просто используйте массив
"CODE" => ["CML2_ARTICLE", "BARCODE"]
Вместо
"CODE"=>"CML2_ARTICLE"
Ответ написан
gromdron
@gromdron
Работаю с Bitrix24
$eventManager = \Bitrix\Main\EventManager::getInstance();

$eventManager->addEventHandlerCompatible('search', 'BeforeIndex',    ['\\CatalogProductIndexer','handleBeforeIndex']);


class CatalogProductIndexer
{
	/**
	 * @var int Идентификатор инфоблока каталога 
	 */
	const IBLOCK_ID = '30';

	/**
	 * Дополняет индексируемый массив нужными значениями
	 * подписан на событие BeforeIndex модуля search
	 * @param array $arFields 
	 * @return array
	 */
	public static function handleBeforeIndex( $arFields = [] )
	{
		if ( !static::isInetesting( $arFields ) )
		{
			return $arFields;
		}

		/**
		 * @var array Массив полей элемента, которые нас интересуют
		 */
		$arSelect = [
			'ID',
			'IBLOCK_ID',
			'PROPERTY_TEST1',
			'PROPERTY_TEST2'
		];

		/**
		 * @var CIblockResult Массив описывающий индексируемый элемент
		 */
		$resElements = \CIBlockElement::getList(
			[],
			[
				'IBLOCK_ID' => $arFields['PARAM2'],
				'ID'        => $arFields['ITEM_ID']
			],
			false,
			[
				'nTopCount'=>1
			],
			$arSelect
		);

		/**
		 * В случае, если элемент найден мы добавляем нужные поля 
		 * в соответсвующие столбцы поиска
		 */
		if ( $arElement = $resElements->fetch() )
		{
			$arFields['TITLE'] .= ' '.$arElement['PROPERTY_TEST1_VALUE'];
			$arFields['BODY'] .= ' '.$arElement['PROPERTY_TEST2_VALUE'];
		}

		return $arFields;
	}

	/**
	 * Возвращает true, если это интересующий нас элемент
	 * @param array $fields 
	 * @return boolean
	 */
	public static function isInetesting( $fields = [] )
	{
		return ( $fields["MODULE_ID"] == "iblock" && $fields['PARAM2'] == static::IBLOCK_ID );
	}

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы