FENOM'енальный курс. Часть 14. Поиск по сайту на mSearch2 на Fenom.

Шаблон MAGAZINE вы можете скачать по ссылке.

Приступим с вами к уже знакомой нам части разработки – реализации поиска по сайту, но в этот раз на основе компонента mSearch2. Почитать как мы это делали ранее на основе SimpleSearch вы можете в статье “Поиск по блогу с помощью SimpleSearch”.

Я нашел 3 места, где у нас должна выводиться форма поиска, за которую отвечает сниппет mSearchForm:

  • В шапке сайта
  • Блок меню в мобильной версии
  • Страница поиска

Так как у нас нет в комплекте шаблона страницы поиска, предлагаю вам пока скопировать шаблон текстовой страницы. Начнем мы с вами с того, что создадим ресурс страницы поиска. Посмотрите, как это сделано у меня:

FENOM'енальный курс. Часть 14. Поиск по сайту на mSearch2 на Fenom.

Я думаю, что мы пойдем с вами сверху вниз и сначала выведем форму в шапке сайта:

{$_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}
	

Теперь можно проверить функциональность нашего поиска по сайту. Надеюсь, что у вас так же, как и у меня все получилось с первого раза.

FENOM'енальный курс. Часть 14. Поиск по сайту на mSearch2 на Fenom.

0 Число голосов: 7
4
5
1
7

Комментарии ()

  1. Вес 16 апреля 2019, 05:15 # 0
    Спасибо, удобные и интересные уроки, очень жаль что вы кладете большой и толстый на дизайн, но видео не об этом, мне нравится ваша подача и функционал у ваших работ внушительный, не забивайте на визуальную составляющую…
    1. Роман 16 июля 2020, 23:40 # 0
      Добрый день, а как вывести общее количество найденных материалов, а так же какой запрос был введён.?
      1. Олег Волков 25 января 2021, 20:13(Комментарий был изменён) # 0
        А он сам не знает как вывести
        1. Петропавловский Артем 27 января 2021, 13:35(Комментарий был изменён) # 0
          Если бы вы были чуточку внимательнее и все же дополнительно прочитали документацию к компоненту, то там нашли бы ответ на свой вопрос. Цитата из документации:
          &tplWrapper - Чанк-обёртка, для заворачивания всех результатов. Понимает плейсхолдеры: [[+output]], [[+total]], [[+query]] и [[+parents]]
          Соответственно все найденные результаты будут храниться в плейсхолдере total, а введенный запрос в query. Также введенный запрос хранится в GET параметре и достать его оттуда тоже не составит труда: можете использовать теги FastField или же штатно реализуется с помощью парсера Fenom.

      Наши клиенты

      Многие компании уже доверяют нам. Будьте в их числе!

      Хотите реализовать проект?

      Контакты

      Напишите нам - мы расскажем вам много интересного!


      Пермь, ул. Крупской 34, офис 510