Отвечаю:
[spoiler]
С версии модуля поиска 10.0.0 добавилась поддержка произвольных параметров связанных с элементами поискового индекса.
Пока в доке это не отражено. Расскажу на примере.
1. Сначала надо связать набор разделов к которым привязан элемент и поисковый индекс.
<? // файл /bitrix/php_interface/init.php // регистрируем обработчик AddEventHandler("search", "BeforeIndex", Array("MyClass", "BeforeIndexHandler")); class MyClass { // создаем обработчик события "BeforeIndex" function BeforeIndexHandler($arFields) { // элемент инфоблока 180 (не раздел) if($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == 180 && substr($arFields["ITEM_ID"], 0, 1) != "S") { $arFields["PARAMS"]["iblock_section"] = array(); //Получаем разделы привязки элемента (их может быть несколько) $rsSections = CIBlockElement::GetElementGroups($arFields["ITEM_ID"], true); while($arSection = $rsSections->Fetch()) { //Сохраняем в поисковый индекс $arFields["PARAMS"]["iblock_section"][] = $arSection["ID"]; } } //Всегда возвращаем arFields return $arFields; } } ?> |
Терерь если пересохранить элемент этого инфоблока или выполнить полную переиндексацию, то на странице просмотра содержания таблиц (в модуле производительности /bitrix/admin/perfmon_table.php?lang=ru&set_filter=Y&table_name=b_search_content_param&find_type=SEARCH_CONTENT_ID&find_PARAM_NAME=i
2 Собственно поиск.
Привожу код страницы с компонентом (несущественные параметры компонента я опустил):
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("Поиск"); global $arSectionFilter; $arSectionFilter = array("PARAMS" => array("iblock_section" => 6759)); ?><?$APPLICATION->IncludeComponent("bitrix:search.page", ".default", array( ... "FILTER_NAME" => "arSectionFilter", "arrFILTER" => array( 0 => "iblock_max", ), "arrFILTER_iblock_max" => array( 0 => "180", ), ... ), false );?><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?> |
3 Если на первом шаге воспользоваться функцией
Оставляю это в качестве упражнения.
Для себя мы сделали: идёт разделение результатов по ИБ, со статикой песня отдельная, но тоже решаемая.
Подумаем обязательно.
Я новичок в битриксе и у меня есть пара вопросов по коду:
if($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == 180 && substr($arFields["ITEM_ID"], 0, 1) != "S"
180 - это id инфоблока, по которому будет осуществляться поиск?
$arSectionFilter = array("PARAMS" => array("iblock_section" => 6759));
6759 - id раздела инфоблока, по которому будет искать поиск? Т.е. если у меня, например, инфоблок "Товары" содержит разделы "Диски", "Книги", "Сувениры" я могу просто сделать выпадающий список рядом со строкой поиска и передавать get'ом id раздела вместо 6759?
А если у меня разел "Книги" содержит подразделы? Т.е. по факту элементы привязаны к подразделам, но поиск нужен по всему разделу "Книги"?
Я правильно понял, что это мне нужно на первом шаге вот здесь
Спасибо.
init.php:
=====================
Что не так?
то все работает. Т.е. почему-то не отрабатывает код
Может вы знаете, что ему нужно?
Почему-то не работает метод ExtractFields, а вот если сделать Fetch() то всё ок.
Спасибо за статью, очень помогло ))
Что-то не возьму в толк...
Подскажите пожалуйста по подробней, как у вас получилось реализовать выпадающий список рядом со строкой поиска?
Т.е. это:
например, в where я получу еще и код секции (из адресной строки придет where=iblock_lists_27_131)
и обработав это значение, вытащу id секции и передам ее в $arSectionFilter. будет ли работать?
Отчего так???
Вопрос снимется.
Понял, недоиндексировались разделы,слишком долгая получается преиндексация для всех инфоблоков(вот и отключил на полпути ее), а для одного id_block никак нельзя сделать переиндексацию?
поиск используется по нескольким инфоблокам сразу, но упорно продолжает выводить деактивированные элементы...
Решил вот так:
в init.php:
перед подключением search.page:
в параметрах search.page:
1) init.php (Спасибо ):
Так не работает:
в таблице индексации b_search_content