Здравствуйте. Создал инфоблок с тегами, чтобы привязывать элементы и использовать в поиске. Но событие CSearch:onBeforeIndex не срабатывает, если переиндексация идёт методом в коде. Как можно решить?
AddEventHandler("search", "BeforeIndex", "ModifySearchContentWithTags");
function ModifySearchContentWithTags($arFields) {
if ($arFields["MODULE_ID"] == "iblock") {
$elementId = $arFields["ITEM_ID"];
$element = CIBlockElement::GetByID($elementId)->Fetch();
if (!$element) return $arFields;
$tagsProperty = CIBlockElement::GetProperty(
$element["IBLOCK_ID"],
$element["ID"],
array(),
array("CODE" => "SEARCH_TAGS")
);
$tagWords = [];
while ($tag = $tagsProperty->Fetch()) {
if (!empty($tag["VALUE"])) {
$tagElement = CIBlockElement::GetByID($tag["VALUE"])->Fetch();
if ($tagElement && !empty($tagElement["PREVIEW_TEXT"])) {
$words = array_map('trim', explode(",", $tagElement["PREVIEW_TEXT"]));
$tagWords = array_merge($tagWords, $words);
}
}
}
if (!empty($tagWords)) {
$arFields["BODY"] .= " " . implode(" ", $tagWords);
}
}
file_put_contents(
$_SERVER["DOCUMENT_ROOT"] . "/search_debug.log",
date("Y-m-d H:i:s") . "\n" .
"Содержимое:\n" . print_r($arFields, true) . "\n" .
"----------------------------------------\n",
FILE_APPEND
);
return $arFields;
}
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "ForceReindexForTaggedElements");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "ForceReindexForTaggedElements");
function ForceReindexForTaggedElements(&$arFields) {
$TAGS_IBLOCK_ID = 71; // ID инфоблока тегов
// Работаем только с элементами-тегами
if ($arFields["IBLOCK_ID"] != $TAGS_IBLOCK_ID) return;
// Находим все элементы, где привязан этот тег
$rsElements = CIBlockElement::GetList(
array(),
array(
"PROPERTY_SEARCH_TAGS" => $arFields["ID"], // Элементы с этим тегом
"ACTIVE" => "Y"
),
false,
false,
array("ID", "IBLOCK_ID", "NAME", "PREVIEW_TEXT", "DETAIL_TEXT", "TIMESTAMP_X")
);
while ($element = $rsElements->Fetch()) {
$fullElement = CIBlockElement::GetByID($element["ID"])->Fetch();
$searchData = array(
"TITLE" => $fullElement["NAME"],
"BODY" => $fullElement["PREVIEW_TEXT"] . " " . $fullElement["DETAIL_TEXT"],
"MODULE_ID" => "iblock",
"ITEM_ID" => $fullElement["ID"],
"PARAM1" => "iblock",
"PARAM2" => $fullElement["IBLOCK_ID"],
"DATE_CHANGE" => $fullElement["TIMESTAMP_X"]
);
$tagsProperty = CIBlockElement::GetProperty(
$fullElement["IBLOCK_ID"],
$fullElement["ID"],
array(),
array("CODE" => "SEARCH_TAGS")
);
$tagContents = [];
while ($tag = $tagsProperty->Fetch()) {
if (!empty($tag["VALUE"])) {
$tagElement = CIBlockElement::GetByID($tag["VALUE"])->Fetch();
if ($tagElement && !empty($tagElement["PREVIEW_TEXT"])) {
$tagContents[] = $tagElement["PREVIEW_TEXT"];
}
}
}
if (!empty($tagContents)) {
$searchData["BODY"] .= " " . implode(" ", $tagContents);
}
$search = new CSearch();
$search->DeleteIndex($fullElement["ID"], "iblock");
$search->Index("iblock", $fullElement["ID"], $searchData, true);
// Логирование
file_put_contents(
$_SERVER["DOCUMENT_ROOT"] . "/search_reindex.log",
date("Y-m-d H:i:s") . " | Элемент ID: " . $fullElement["ID"] . "\n" .
"Количество тегов: " . count($tagContents) . "\n" .
"Длина BODY: " . strlen($searchData["BODY"]) . "\n" .
"Содержимое searchData:\n" . print_r($searchData, true) . "\n" . // Вот эта строка добавляет массив
"----------------------------------------\n",
FILE_APPEND
);
}
}
AddEventHandler("search", "BeforeIndex", "ModifySearchContentWithTags");
function ModifySearchContentWithTags($arFields) {
if ($arFields["MODULE_ID"] == "iblock") {
$elementId = $arFields["ITEM_ID"];
$element = CIBlockElement::GetByID($elementId)->Fetch();
if (!$element) return $arFields;
$tagsProperty = CIBlockElement::GetProperty(
$element["IBLOCK_ID"],
$element["ID"],
array(),
array("CODE" => "SEARCH_TAGS")
);
$tagWords = [];
while ($tag = $tagsProperty->Fetch()) {
if (!empty($tag["VALUE"])) {
$tagElement = CIBlockElement::GetByID($tag["VALUE"])->Fetch();
if ($tagElement && !empty($tagElement["PREVIEW_TEXT"])) {
$words = array_map('trim', explode(",", $tagElement["PREVIEW_TEXT"]));
$tagWords = array_merge($tagWords, $words);
}
}
}
if (!empty($tagWords)) {
$arFields["BODY"] .= " " . implode(" ", $tagWords);
}
}
file_put_contents(
$_SERVER["DOCUMENT_ROOT"] . "/search_debug.log",
date("Y-m-d H:i:s") . "\n" .
"Содержимое:\n" . print_r($arFields, true) . "\n" .
"----------------------------------------\n",
FILE_APPEND
);
return $arFields;
}
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "ForceReindexForTaggedElements");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "ForceReindexForTaggedElements");
function ForceReindexForTaggedElements(&$arFields) {
$TAGS_IBLOCK_ID = 71; // ID инфоблока тегов
// Работаем только с элементами-тегами
if ($arFields["IBLOCK_ID"] != $TAGS_IBLOCK_ID) return;
// Находим все элементы, где привязан этот тег
$rsElements = CIBlockElement::GetList(
array(),
array(
"PROPERTY_SEARCH_TAGS" => $arFields["ID"], // Элементы с этим тегом
"ACTIVE" => "Y"
),
false,
false,
array("ID", "IBLOCK_ID", "NAME", "PREVIEW_TEXT", "DETAIL_TEXT", "TIMESTAMP_X")
);
while ($element = $rsElements->Fetch()) {
$fullElement = CIBlockElement::GetByID($element["ID"])->Fetch();
$searchData = array(
"TITLE" => $fullElement["NAME"],
"BODY" => $fullElement["PREVIEW_TEXT"] . " " . $fullElement["DETAIL_TEXT"],
"MODULE_ID" => "iblock",
"ITEM_ID" => $fullElement["ID"],
"PARAM1" => "iblock",
"PARAM2" => $fullElement["IBLOCK_ID"],
"DATE_CHANGE" => $fullElement["TIMESTAMP_X"]
);
$tagsProperty = CIBlockElement::GetProperty(
$fullElement["IBLOCK_ID"],
$fullElement["ID"],
array(),
array("CODE" => "SEARCH_TAGS")
);
$tagContents = [];
while ($tag = $tagsProperty->Fetch()) {
if (!empty($tag["VALUE"])) {
$tagElement = CIBlockElement::GetByID($tag["VALUE"])->Fetch();
if ($tagElement && !empty($tagElement["PREVIEW_TEXT"])) {
$tagContents[] = $tagElement["PREVIEW_TEXT"];
}
}
}
if (!empty($tagContents)) {
$searchData["BODY"] .= " " . implode(" ", $tagContents);
}
$search = new CSearch();
$search->DeleteIndex($fullElement["ID"], "iblock");
$search->Index("iblock", $fullElement["ID"], $searchData, true);
// Логирование
file_put_contents(
$_SERVER["DOCUMENT_ROOT"] . "/search_reindex.log",
date("Y-m-d H:i:s") . " | Элемент ID: " . $fullElement["ID"] . "\n" .
"Количество тегов: " . count($tagContents) . "\n" .
"Длина BODY: " . strlen($searchData["BODY"]) . "\n" .
"Содержимое searchData:\n" . print_r($searchData, true) . "\n" . // Вот эта строка добавляет массив
"----------------------------------------\n",
FILE_APPEND
);
}
}