BeforeIndex
Описание и параметры
функция-обработчик( array arFields );
Событие "BeforeIndex" вызывается перед индексацией элемента методом CSearch::Index.
Важно! Функция-обработчик не принимает параметр arFields по ссылке. Не верно: function BeforeIndexHandler(&$arFields)
. Верно: function BeforeIndexHandler($arFields)
.
Параметры
Параметр | Описание |
---|---|
arFields | Массив следующего содержания:
|
Данный обработчик может модифицировать поля параметра arFields и должен вернуть его как результат своей работы.
Важные моменты
- Если в обработчике проводятся модификации поля SITE_ID, то надо помнить,что индексы в массиве должны быть с нуля и по порядку. Иначе массив будет воспринят как ассоциативный и элементы привяжутся к сайтам неверно (вместо SITE_ID окажутся числа и элементы пропадут из поиска).
- Чтобы не добавлять запись в индекс (например, если надо какой-то подраздел инфоблока не индексировать), необходимо в функции-обработчике выполнить:
unset($arFields["BODY"]); unset($arFields["TITLE"]);
- Если выполняются проверки типа:
$bTitle = array_key_exists("TITLE", $arFields); $bBody = array_key_exists("BODY", $arFields); if($bTitle && $bBody && strlen($arFields["BODY"])<=0 && strlen($arFields["TITLE"])<=0)
то для исключения элемента из индекса как записи следует выполнять:
$arFields["BODY"]=''; $arFields["TITLE"]='';
Смотрите также
Примеры
Пример функции-обработчика:
<?
// файл /bitrix/php_interface/init.php
// регистрируем обработчик
AddEventHandler("search", "BeforeIndex", Array("MyClass", "BeforeIndexHandler"));
class MyClass { // создаем обработчик события "BeforeIndex" public static function BeforeIndexHandler($arFields) { if($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == 33) { if(array_key_exists("BODY", $arFields)) { $arFields["BODY"] .= " самые свежие новости"; } } return $arFields; } } ?>
Пример использования функции-обработчика:
Пример использования функции-обработчика, чтобы компонент search.title проводил поиск не только по заголовкам, но и некоторому свойству:
// регистрируем обработчик 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; // вернём изменения }
Сообщение не промодерировано, возможны ошибки и неточности.
|
||||
Странно, что не упоминается возможность добавить в `$arFields` ключ `PARAMS`, например:
После чего в таблице `b_search_content_param` для проиндексированной записи добавится ключ `myKey` со значением `abc`. После этого в метод `CSearch::Search` в первый аргумент можно добавить фильтрацию по этому ключу, типа:
| ||||
Андрей Чурсин
|
$fields["PARAM1"] - тип ИБ
$fields["PARAM2"] - ID ИБ |
Алексей Попович
|
||
Пример обработчика, исключающего элемент инфоблока из поискового индекса по свойству для случая, когда инфоблок привязан к нескольким сайтам:
| ||
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.