Битрикс. Поиск на сайте

07.07.2018

Теги: $arResultCMSWeb-разработкаБитриксКомпонентПоискФормаШаблонКомпонента

Задача — создать форму поиска, которая будет доступна на всех страницах сайта. Для этого используем два компонента: «Форма поиска» и «Стандартная страница поиска». Сначала создаем новый раздел search в корне сайта, где будут показываться результаты поиска. Вызываем визуальный редактор и справа выбираем «Служебные • Поиск • Стандартная страница поиска». В настройках поиска убираем постраничную навигацию сверху, все остальное оставляем «как есть»:

Включаем режим правки и копируем шаблон компонента. Имя шаблона будет search, копируем в общий шаблон local/templates/.default:

Открываем на редактирование скопированный шаблон local/templates/.default/components/bitrix/search.page/search/template.php, удаляем оттуда весь мусор от разработчиков Битрикс и пишем свой код:

<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
?>

<div class="search-page">
<?php if (count($arResult["SEARCH"]) > 0): /* если что-то найдено */ ?>
    <?php if ($arParams["DISPLAY_TOP_PAGER"] != "N") echo $arResult["NAV_STRING"]; /* постраничная навигация вверху */ ?>

    <?php foreach($arResult["SEARCH"] as $arItem): ?>
        <div>
            <a href="<?= $arItem["URL"]; ?>"><?= $arItem["TITLE_FORMATED"]; ?></a>
            <p><?= $arItem["BODY_FORMATED"]; ?></p>
        </div>
    <?php endforeach;?>

    <?php if($arParams["DISPLAY_BOTTOM_PAGER"] != "N") echo $arResult["NAV_STRING"]; /* постраничная навигация внизу */ ?>
<?php else: ?>
    <p><?= GetMessage("SEARCH_NOTHING_TO_FOUND")); /* ничего не найдено */ ?></p>
<?php endif; ?>
</div>

Осталось только изменить шаблон постраничной навигации, вместо того безобразия, которое Битрикс предлагает по умолчанию. У меня такой шаблон уже был:

<?php
/*
 * Файл local/templates/.default/components/bitrix/system.pagenavigation/pager/template.php
 */

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$this->setFrameMode(true);

if (!$arResult["NavShowAlways"]) {
    if ($arResult["NavRecordCount"] == 0 || ($arResult["NavPageCount"] == 1 && $arResult["NavShowAll"] == false)) return;
}

$strNavQueryString = ($arResult["NavQueryString"] != "" ? $arResult["NavQueryString"]."&amp;" : "");
$strNavQueryStringFull = ($arResult["NavQueryString"] != "" ? "?".$arResult["NavQueryString"] : "");
?>

<nav>
    <ul class="pagination">
        <?php if ($arResult["NavPageNomer"] > 1): /* показываем ссылку на предыдущую страницу */ ?>
            <?php if ($arResult["NavPageNomer"] > 2): /* доп.условие, чтобы убрать /blog/?PAGEN_1=1 для первой страницы */ ?>
                <li>
                    <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]-1)?>" aria-label="Предыдущая">
                        <span aria-hidden="true">«</span>
                    </a>
                </li>
            <?php else: ?>
                <li>
                    <a href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>" aria-label="Предыдущая">
                        <span aria-hidden="true">«</span>
                    </a>
                </li>
            <?php endif; ?>
        <?php endif; ?>

        <?php while ($arResult["nStartPage"] <= $arResult["nEndPage"]): /* цикл с первой по последнюю страницу */ ?>
            <?php if ($arResult["nStartPage"] == $arResult["NavPageNomer"]): /* если это текущая страница */ ?>
                <li class="active"><a><?=$arResult["nStartPage"]?></a></li>
            <?php elseif ($arResult["nStartPage"] == 1 && $arResult["bSavePage"] == false): /* если это ссылка на первую страницу */ ?>
                <li><a href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>"><?=$arResult["nStartPage"]?></a></li>
            <?php else: ?>
                <li><a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=$arResult["nStartPage"]?>"><?=$arResult["nStartPage"]?></a></li>
            <?php endif; ?>
            <?php $arResult["nStartPage"]++ /* увеличиваем счетчик страниц */ ?>
        <?php endwhile; ?>

        <?php if ($arResult["NavPageNomer"] < $arResult["NavPageCount"]): /* показываем ссылку на следующую страницу */ ?>
            <li>
                <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]+1)?>" aria-label="Следующая">
                    <span aria-hidden="true">»</span>
                </a>
            </li>
        <?php endif; ?>
    </ul>
</nav>

Так что мне достаточно только указать его имя pager в настройках компонента:

Поскольку поиск должен быть доступен везде:

  • вызов компонента «Форма поиска» разместим во всех шаблонах страниц (у меня это voguis_index и voguis_blog)
  • сам шаблон компонента «Форма поиска» разместим в шаблоне по умолчанию local/templates/.default
[local]
    [templates]
        [.default]
            [components]
                [bitrix]
                    [menu]
                    [search.form]
                    [search.page]
                    [system.pagenavigation]
            [css]
            [images]
            [include_areas]
            [js]
            favicon.ico
        [voguis_blog]
        [voguis_index]

Как обычно, чтобы получить код вызова компонента со всеми параметрами, переходим на тестовую страницу и вызываем визуальный редактор. Выбираем в правой колонке компонент «Служебные • Поиск • Форма поиска». Копируем код вызова компонента и выходим без сохранения.

<?php
$APPLICATION->IncludeComponent(
    "bitrix:search.form",
    "",
    array(
        "PAGE" => "#SITE_DIR#search/index.php",
        "USE_SUGGEST" => "N"
    )
);
?>

Открываем на редактирование файлы шаблонов

  • local/templates/voguis_index/footer.php
  • local/templates/voguis_blog/footer.php

Комментируем HTML-код формы поиска и вставляем вызов компонента:

<!--
<div class="b-search">
    <form>
        <input type="text" value="Search" onfocus="this.value='';" onblur="if (this.value=='') {this.value='Search';}">
        <input type="submit" value="">
    </form>
</div>
-->
<?php
$APPLICATION->IncludeComponent(
    "bitrix:search.form",
    "",
    array(
        "PAGE" => "#SITE_DIR#search/index.php",
        "USE_SUGGEST" => "N"
    )
);
?>

Переходим на главную страницу сайта, включаем режим правки и копируем шаблон компонента:

Имя шаблона будет search, копируем в папку общего шаблона .default:

Код вызова компонента в файле local/templates/voguis_index/footer.php был перезаписан, но нам еще нужно изменить код вызова и в шаблоне local/templates/voguis_blog/footer.php:

<?php
$APPLICATION->IncludeComponent(
    "bitrix:search.form",
    "search",
    array(
        "PAGE" => "#SITE_DIR#search/index.php", // Страница выдачи результатов поиска (доступен макрос #SITE_DIR#)
        "USE_SUGGEST" => "N",                   // Показывать подсказку с поисковыми фразами
    ),
    false
);
?>

Открываем на редактирование скопированный шаблон local/templates/.default/components/bitrix/search.form/search/template.php.

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
$this->setFrameMode(true);?>
<div class="search-form">
<form action="<?=$arResult["FORM_ACTION"]?>">
    <table border="0" cellspacing="0" cellpadding="2" align="center">
        <tr>
            <td align="center"><?if($arParams["USE_SUGGEST"] === "Y"):?><?$APPLICATION->IncludeComponent(
                "bitrix:search.suggest.input",
                "",
                array(
                    "NAME" => "q",
                    "VALUE" => "",
                    "INPUT_SIZE" => 15,
                    "DROPDOWN_SIZE" => 10,
                ),
                $component, array("HIDE_ICONS" => "Y")
            );?><?else:?><input type="text" name="q" value="" size="15" maxlength="50" /><?endif;?></td>
        </tr>
        <tr>
            <td align="right"><input name="s" type="submit" value="<?=GetMessage("BSF_T_SEARCH_BUTTON");?>" /></td>
        </tr>
    </table>
</form>
</div>

Табличная верстка двадцатилетней давности нам не нужна, так что удаляем все и пишем свой код:

<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */

$this->setFrameMode(true);
?>

<div class="b-search">
    <form action="<?= $arResult["FORM_ACTION"]; ?>">
        <input type="text" name="q" value="Поиск" onfocus="this.value='';" onblur="if (this.value=='') {this.value='Поиск';}">
        <input type="submit" name="s" value="">
    </form>
</div>

Дополнительно

Поиск: $arResult • CMS • Web-разработка • Битрикс • Компонент • Поиск • Форма • Шаблон компонента • Search • Form

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.