Блог специалистов
13.12.2012

Делаем поиск на сайте только по товарам с выводом по свойству и с дизайном каталога

Была задача сделать поиск на сайте только по товарам с выводом результатов с товарами в таком же дизайне как и в каталоге.

Приступаем к решению:

Для этого на сайте сделана форма поиска с кодом в шаблоне сайта:

<form method="get" action="/search/" class="searchBox">
    <input type="text" value="" name="q" id="searchInput" class="d">
    <input type="submit" value="&nbsp;" 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" => "",
...
);?>


Количество показов: 8952




Возврат к списку