Skip to content

Instantly share code, notes, and snippets.

@Isa3v
Created January 15, 2019 10:29
Show Gist options
  • Save Isa3v/1fd297102da528c3f1241f1439a19f09 to your computer and use it in GitHub Desktop.
Save Isa3v/1fd297102da528c3f1241f1439a19f09 to your computer and use it in GitHub Desktop.
Поиск в битрикс с доп. фильтрацией по разделам (Как у ситилинк)

Поиск в битрикс с доп. фильтрацией по разделам (Как у ситилинк)

  • Сначала надо связать набор разделов к которым привязан элемент и поисковый индекс. В файл /php_interface/init.php - добавляем код из листа init.php
  • Делаем переиндексацию через админку
  • Редактируем шаблон поиска по примеру из template.php

После, должен появится список ссылок фильтрующий поиск по ID раздела

Было реализовано на разработке - dev.1c-bitrix.ru/community/blogs/oracle/2687.php

<?php
//....
AddEventHandler("search", "BeforeIndex", Array("MyClassSearch", "BeforeIndexHandler"));
class MyClassSearch
{
// создаем обработчик события "BeforeIndex"
function BeforeIndexHandler($arFields)
{
if($arFields["MODULE_ID"] == "iblock" && substr($arFields["ITEM_ID"], 0, 1) != "S")
{
$arFields["PARAMS"]["iblock_section"] = array();
//Получаем разделы привязки элемента (их может быть несколько)
$rsSections = CIBlockElement::GetElementGroups($arFields["ITEM_ID"], true);
while($arSection = $rsSections->Fetch())
{
$nav = CIBlockSection::GetNavChain(false, $arSection["ID"]);
while($ar = $nav->Fetch()) {
//Сохраняем в поисковый индекс
$arFields["PARAMS"]["iblock_section"][] = $ar[ID];
}
}
}
//Всегда возвращаем arFields
return $arFields;
}
}
?>
<? //... header и т.д
// Филтьтр по разделу
global $arSectionFilter;
if($_GET['section']){
$arSectionFilter = array("PARAMS" => array("iblock_section" => $_GET['section']));
}
$arElements = $APPLICATION->IncludeComponent(
"bitrix:search.page",
"",
Array(
//...
"FILTER_NAME" => "arSectionFilter",
//...
),
$component
);
if (is_array($arElements) && !empty($arElements)){?>
<h2>Найдено в категориях:</h2>
<?//Получаем разделы элементов
$rsSections = CIBlockElement::GetElementGroups($arElements, true);
while($arSection = $rsSections->Fetch()){
if ($arSection['ACTIVE'] == 'Y'){
//Нам нужно только название раздела и ID
$sectionSearch[$arSection['ID']]['ID'] = $arSection['ID'];
$sectionSearch[$arSection['ID']]['NAME'] = $arSection['NAME'];
}
}
if (isset($_GET['section'])){
//Сбрасываем фильтр по раздела (Убираем section=#)
$all_seacrh = $_GET;
unset($all_seacrh['section']);
$all_seacrh = $APPLICATION->GetCurDir().'?'.http_build_query($all_seacrh); ?>
<a href="<?=$all_seacrh?>">← назад к поиску</a>
<?}else{
foreach ($sectionSearch as $section){
//Добавляем параметр ID раздела как GET-параметр section и добавляем ссылку
$url = $_SERVER["REQUEST_URI"];
$url .= (isset($_SERVER["QUERY_STRING"]) ? '&section='.$section['ID'] : '?section='.$section['ID']);?>
<a href="<?=$url?>"><?=$section['NAME']?></a>
<?}?>
<?}?>
<?}
//... там все тоже самое идет
?>
@omelyanchuk-ss
Copy link

С компонентом catalog.search возможно подружить? категории показывает верные, а при нажатии на категорию, фильтрация не срабатывает((.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment