Битрикс. Поиск на сайте
07.07.2018
Теги: $arResult • CMS • Web-разработка • Битрикс • Компонент • Поиск • Форма • ШаблонКомпонента
Задача — создать форму поиска, которая будет доступна на всех страницах сайта. Для этого используем два компонента: «Форма поиска» и «Стандартная страница поиска». Сначала создаем новый раздел 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"]."&" : ""); $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>
Дополнительно
- Битрикс. Создание простого компонента. Часть 2 из 2
- Битрикс. Создание простого компонента. Часть 1 из 2
- Битрикс. Регистрация и авторизация. Часть 3 из 3
- Битрикс. Регистрация и авторизация. Часть 2 из 3
- Битрикс. Регистрация и авторизация. Часть 1 из 3
- Битрикс. Форма обратной связи
- Битрикс. Облако тегов
Поиск: $arResult • CMS • Web-разработка • Битрикс • Компонент • Поиск • Форма • Шаблон компонента • Search • Form