Приступим с вами к уже знакомой нам части разработки – реализации поиска по сайту, но в этот раз на основе компонента mSearch2. Почитать как мы это делали ранее на основе SimpleSearch вы можете в статье “Поиск по блогу с помощью SimpleSearch”.
Я нашел 3 места, где у нас должна выводиться форма поиска, за которую отвечает сниппет mSearchForm:
- В шапке сайта
- Блок меню в мобильной версии
- Страница поиска
Так как у нас нет в комплекте шаблона страницы поиска, предлагаю вам пока скопировать шаблон текстовой страницы. Начнем мы с вами с того, что создадим ресурс страницы поиска. Посмотрите, как это сделано у меня:
Я думаю, что мы пойдем с вами сверху вниз и сначала выведем форму в шапке сайта:
{$_modx->runSnippet('!mSearchForm', [ 'element' => 'msProducts', 'tplForm' => '@FILE chunks/search_form_desktop.tpl', 'pageId' => 68 ])}
Параметр pageId – это идентификатор ресурса, на котором мы будем выводить результаты поиска. Чанк search_form_desktop.tpl:
<form action="{$pageId | url}" method="get" class="msearch2"> <input type="text" name="{$queryVar}" placeholder="Поиск по сайту" value="{$.get.query}"> <button type="submit"> <i class="fa fa-search"></i> </button> </form>
Вызов mSearchForm в блоке мобильного меню:
{$_modx->runSnippet('!mSearchForm', [ 'element' => 'msProducts', 'tplForm' => '@FILE chunks/search_form_mobile.tpl', 'pageId' => 68 ])}
Чанк search_form_mobile.tpl:
<form action="{$pageId | url}" method="get" class="msearch2"> <div class="input-group"> <input type="text" class="form-control" name="{$queryVar}" placeholder="Поиск по сайту" value="{$.get.query}"> <div class="input-group-append"> <button class="btn btn-default" type="submit"> <i class="fa fa-search"></i> </button> </div> </div> </form>
Вызов в шаблоне поиска по сайту:
{$_modx->runSnippet('!mSearchForm', [ 'tplForm' => '@FILE chunks/search_form_page.tpl', ])}
Чанк search_form_page.tpl:
<form action="{$pageId | url}" method="get" class="well msearch2" id="mse2_form"> <div> <div class="input-group mb-3"> <input type="text" class="form-control" name="{$queryVar}" placeholder="Поиск по сайту" value="{$.get.query}" /> <div class="input-group-append"> <button type="submit" class="btn btn-outline-secondary"> <i class="glyphicon glyphicon-search"></i> Найти </button> </div> </div> </div> </form>
В данных чанках мы с вами использовали новую Fenom-конструкцию {$.get.query}, которая позволяет нам получать элементы массива GET. Аналогично можно получать элементы массивов REQUEST, POST, SESSION.
Отлично! Формы мы вывели. Теперь нам нужно вывести обработчик запроса. Поиск, я думаю, мы с вами будем производить только по товарам. Сниппет mSearch2 будет возвращать только id найденных ресурсов, а их мы будем передавать в сниппет msProducts. В итоге у нас получится примерно такой шаблон страницы поиска по сайту:
{extends 'file:templates/index.tpl'} {block 'content'} {include 'file:chunks/breadcrumbs.tpl'} <section class="def-section content"> <div class="container"> <h1>{$_modx->resource.longtitle ?: $_modx->resource.pagetitle}</h1> {$_modx->runSnippet('!mSearchForm', [ 'tplForm' => '@FILE chunks/search_form_page.tpl', ])} {var $res = $_modx->runSnippet('!mSearch2', [ 'tpl' => '@FILE chunks/product_tpl.tpl', 'parents' => 2, 'returnIds' => 1, 'where' => '{"template":11}' ])} {if $res} <div id="pdopage" class="products"> <div class="search-results row rows"> {$_modx->runSnippet('!pdoPage', [ 'element' => 'msProducts', 'parents' => 0, 'resources' => $res, 'tpl' => '@FILE chunks/product_tpl.tpl', 'limit' => 9, 'ajaxMode' => 'button', 'ajaxTplMore' => '@INLINE <button class="btn btn-blue btn-block btn-more">Загрузить еще</button>', ])} </div> <div class="pagination"> {$_modx->getPlaceholder('page.nav')} </div> </div> {/if} </div> </section> {/block}
Теперь можно проверить функциональность нашего поиска по сайту. Надеюсь, что у вас так же, как и у меня все получилось с первого раза.