Делаем поиск на сайте только по товарам с выводом по свойству и с дизайном каталога
Была задача сделать поиск на сайте только по товарам с выводом результатов с товарами в таком же дизайне как и в каталоге.
Приступаем к решению:
Для этого на сайте сделана форма поиска с кодом в шаблоне сайта:
<form method="get" action="/search/" class="searchBox">
<input type="text" value="" name="q" id="searchInput" class="d">
<input type="submit" value=" " class="button">
</form>
Далее сделана странца /search/ без прямого на нее доступа. На ней был выведен инфоблок bitrix:catalog.section и перед ним была тоже организована строка поиска, для удобства. Доступ на эту страницу напрямую организован не был, т.к. на ней без запроса выводятся сразу все элементы кататалога (товары), а этого никто видеть не должен.
Далее на этой же странице до строки поиска и кода вывода каталога, вставляется фильтр для возможности передачи данных в него через строку поиска.
Поиск-фильтр этот может искать по словам, а так же по свойствам, например, по Серии. Серия товара организована как свойство с привязкой к элементам. Наш поиск, если видит, что в него попали поисковые слова, относящиеся к названию серии, то он выводит товары только для этой серии. В коде это видно по условию IF, если же слова не содержатся в Серии, он выдает товары с этим словом в содержании, названии и т.п., по чему осуществлялся поиск.
В этом поиске так же выолнен цикл для возможности выводить не только одну Серию, а несколько. Наример, мы искали Серию "Glass", а у нас есть еще серия "Super Glass", то благодаря цикул в коде нашего фильтра выведутся товары для обоих серий. Без этого цикла вывелись бы толькло товары одной Серии, которая была бы с меньшим значением ID.
Прошу прощения, за некоторую нелогичность и неграмотность кода, но умелые программисты поймут идею и не будут меня ругать :).
<?
//Стандартное для битрикса начала файла
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetPageProperty("keywords", "Поиск продукции");
$APPLICATION->SetPageProperty("description", "Поиск продукции");
$APPLICATION->SetTitle("Поиск продукции");
//Начало фильтра для поиска
if ($_REQUEST["q"] != '')
{
CModule::IncludeModule("iblock");
$Serie= CIBlockElement::GetList(array(), array("ACTIVE"=>"Y", "%NAME"=>$_REQUEST['q'], "IBLOCK_ID"=>5), false, false, array("ID", "NAME"));
while($ar_fields = $Serie->GetNext()) //делаем цикл, иначе фильтр сработает только для первого найденного значения
{
$massiv[]=$ar_fields["ID"]; //выстраиваем цикл нащих значений
}
IF ($massiv > 0) //это уже условие для поиска, оно немного неправильное, т.к. по нему можно вывести только данные для 5-и значений, его тут нужно доработать, если значений у Вас намного больше
$arCatFilter = array("PROPERTY_SERIE"=> array($massiv["0"], $massiv["1"], $massiv["2"], $massiv["3"], $massiv["4"]));
else
$arCatFilter = array("%NAME" => $_REQUEST['q']);
}
?>
<? print_R($arCatFilter);?> <!-- выводит параметры по которым идет фильтрация, включана на время разработки сайта -->
<!-- Поле для поиска -->
<div class="header">
<form class="searchBox leftForm" action="/search/" method="get">
<input id="searchInput" class="nonValue" type="text" name="q" value="<?=$_REQUEST["q"]?>">
<input class="button" type="submit" value=" ">
</form>
</div>
<!-- Дальше идет код нашего инфоблока к которому применяется поиск посредством фильтрации -->
<?$APPLICATION->IncludeComponent("bitrix:catalog.section", ".default", array(
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "3",
"SECTION_ID" => "",
"SECTION_CODE" => "",
...
);?>
Количество показов: 27009