MODX. Поиск на сайте. Компонент SimpleSearch

Простейший поиск

Простейший путь для реализации поиска на сайте на cmf MODX — воспользоваться дополнением SimpleSearch. Оно прекрасно подходит для небольших сайтов, функционально и просто в настройке. Из недостатков дополнения — с TV полями работает только после дополнительного допиливания.

Для реализации поиска через SimpleSearch надо:

  1. Установить дополнение SimpleSearch;
  2. Создать новый ресурс, страницу на которой будет отображаться результат поиска:
    • Имя: Результаты поиска;
    • Псевдоним: search;
    • Галки: «не показывать в меню» и «Оубликован»;
    • Убрать галки: «Доступен для поиска», «Кешируемый»;
    • В поле содержимого вставляем 
    [[!SimpleSearch]]

    Запомните ID созданного ресурса — он нам еще понадобится.

    • В шаблон, на место где должен находиться поиск вставляем следующий код:
      [[!SimpleSearchForm? &landing=`1` &tpl=`tpl.search`]]
      • &landing: ID созданной страницы;
      • &tpl: шаблон формы поиска.
  3. Создаем чанк tpl.search. Код можно использовать такой:

    
    <form class="search" action="[[~[[+landing]]]]" method="[[+method]]"  > 
        <fieldset>   
            <input type="text" name="[[+searchIndex]]" id="[[+searchIndex]]" value="[[+searchValue]]" />   
            <input type="hidden" name="id" value="[[+landing]]" />
            <input type="submit" value="[[[[%sisea.search? &namespace=`sisea` &topic=`default`]]]]" /> 
        </fieldset>
    </form>
    

 Теперь поиск должен появиться на сайте.

Ajax поиск

В шаблоне, там где должен появляться результат поиска, пишем:

<div id="search-ajax-results-wrap" class="search-ajax-results-wrap"></div>

Создаем новую страницу, для вычисления результатов поиска. На ней размещаем вызов сниппета SimpleSearch в обертке:

<div class="search-ajax-results">
     [[!SimpleSearch]]
</div>

Добавляем скрипт:

// Кнопка 
    	$(".search").submit(function () {
            // раскоментировать если нужна кнопка
            //$("#search-ajax-results-wrap").load("/tools/search-results-ajax/ .search-ajax-results",$(".search").serialize()).slideDown("fast"); 
            return false;
    	});
    	// Живой поиск
    	$(".search input").keyup(function() {
    		if(this.value.length > 2) { // Пользователь набирает больше 2 символов в строке поиска
    			// скрывает/отображает с результаты за пределами окна
    			$(document).click(function(event){ // скрываем
    				if ($(event.target).closest(".search-ajax-results-wrap").length) return;
    				$(".search-ajax-results-wrap").slideUp("fast");
    				//event.stopPropagation();
    			});
    			$('.search').click( function() { // отображаем
    				$(".search-ajax-results-wrap").slideDown("fast");
    				return false;
    			});	
    			// ajax запрос загрузка результатов поиска от страницы и показ контейнера
    			$("#search-ajax-results-wrap").load("/tools/search-results-ajax/ .search-ajax-results",$(".sisea-search-form").serialize()).slideDown("fast");
    		}
    		else {
    		    // Если набрано меньше 2 символов, скрыть контейнер (CSS display:none;)
    			$("#search-ajax-results-wrap").slideUp("fast"); 
    		}
    	});

P.S. Поиск в компоненте SimpleSearch привязан к классу .sisea-search-form. Если хотите изменить класс в скрипте, придется перенастраивать компонент.

Документация

Компонент состоит из 2 сниппетов:

  • SimpleSearchForm — отображает форму поиска;
  • SimpleSearch — отображает результаты поиска, основываясь на отправленных поисковых результатах.

Параметры SimpleSearchForm

  По умолчанию  
&landing   Ресурс с результатами поиска, который будет открываться после нажатия кнопки поиск
&searchIndex search Имя параметра REQUEST, которое будет использоваться
&method GET Метод передачи данных который будет использоваться, POST или GET
&toPlaceholder   Если установлено, результаты поиска будут размещены в плейсхолдер с этим именем

Шаблоны SimpleSearchForm

&tpl — шаблон формы поиска.

По умолчанию SearchForm.

Доступные плейсхолдеры

[[+landing]] — идентификатор ресурса для отображения результатов поиска. По умолчанию используется текущий ресурс..

[[+method]] — метод передачи данных GET или POST. По умолчанию GET.

[[+searchValue]] — текущее значение поиска. Значение по умолчанию пустое, если не был выполнен предварительный поиск.

[[+searchIndex]] — REQUEST использующийся в качестве параметра поиска.

По умолчанию

<form class="sisea-search-form" action="[[~[[+landing:default=`[[*id]]`]]]]" method="[[+method:default=`get`]]"><font></font>
  <fieldset><font></font>
    <label for="[[+searchIndex]]">[[%sisea.search? &namespace=`sisea` &topic=`default`]]</label><font></font>
    <input type="text" name="[[+searchIndex]]" id="[[+searchIndex]]" value="[[+searchValue]]" /><font></font>
    <input type="hidden" name="id" value="[[+landing:default=[[*id]]]]" /> <font></font>
    <input type="submit" value="[[%sisea.search? &namespace=`sisea` &topic=`default`]]" /><font></font>
  </fieldset><font></font>
</form><font></font>

Параметры SimpleSearch

  По умолчанию Описание
tpl SearchResult Чанк который будет использоваться для отображения каждого результата.
containerTpl SearchResults Чанк который будет использоваться в качестве обертки результатов поиска, в нем можно указать расположение пагинации и дополнительных сообщений.
useAllWords 0 Если указано true, будут найдены только те результаты, которые полностью совпадают с указанными словами.
maxWords 7 Максимальное количество слов допустимое в поиске. Применяется, если значение useAllWords установлено в off.
minChars 3 Минимальное количество символов для поиска.
searchStyle partial Стиль поиска: partial — использует оператор LIKE;  match — основывается на релевантности.
andTerms 1 Добавлять или нет логическое AND между словами.
matchWildcard 1 Активирует подстановочный поиск. Надо установить false чтобы поиск выполнялся по точному совпадению.
docFields pagetitle, longtitle, alias, description, introtext, content Разделенный запятыми список полей ресурса участвующих в поиске. 
fieldPotency  

Оценка и сортировка результатов. Например: &fieldPotency=`pagetitle:10,content:1`

Допустим при запросе «сайт» вылезает 2 документа. У первого слово встречается 1 раз в заголовке и 1 раз в тексте, у второго 10 раз в тексте. Соответственно второй документ будет предпочтительнее. Это свойство позволяет задавать приоритет для полей

(В старых версиях компонента есть баг, свойство правильно обрабатывает только то количество страниц, которое указано в perPage)

perPage 10 Количество результатов поиска выводящихся на странице.
showExtract 1 Выводить или нет анонс контента для каждого результата.
extractSource content Позволяет пользователю определить, откуда извлекается результат. Если значение этого параметра — поле ресурса (включая TV, если includeTVs установлено), тогда это поле ресурса используется для выделения. В противном случае, параметр берется из имени запущенного сниппета. Сниппет передает ресурсу массив как параметры.  Если сниппет с данным именем не найден, тогда параметр выделения остается пустым.
extractLength 200 Количество символов, для отображения каждого результата поиска.
extractEllipsis ... Строка, использующаяся для сокращения результата поиска.
includeTVs 0 Надо проставить 1, если необходимо подключить дополнительные поля(TV), для доступа в результатах поиска. Включение этой опции может сильно замедлить время отображения результатов.
includeTVList   Необязательный, разделенный запятыми список имен дополнительных полей, которые должны включаться при обработкее поиска, если includeTVs установлен 1. 
process TVs 0 Указывается если значения дополнительных полей (TV) должны быть отображены так же как они отображались бы на странице ресурса. Некоторые особенности: 
Дополнительные поля могут быть доступны по их именам . По умолчанию SimpleSearch не использует префиксы, например не будет отображен. 
Дополнительные поля начинают индексироваться в процессе Solr поиска, поэтому здесь нет необходимости их индексации.
highlightResults 1 Выделять или нет найденный термин в результатах поиска.
highlightClass sisea-highlight Имя CSS класса, которое добавляется к тегу оборачивающему найденный термин в результате поиска.
highlightTag span Html тег, оборачивающий найденный термин в результате поиска.
pageTpl PageLink Чанк для ссылки пагинации. 
currentPageTpl CurrentPageLink Чанк использующийся для текущей страницы пагинации. 
pagingSeparator | Разделитель использующийся между ссылками пагинации.
ids   Разделенный запятыми список ID для ограничения поиска.
idType parents Ограничение типа для параметра ID. Если parents, в поиск будут добавляться все дочерние ресурсы с ID включенными в ids параметрами. Если documents, будут использоваться только указанные ID. 
exclude   Разделенный запятыми список ID ресурсов исключенных из поиска.
depth 10 Если в idType установлено parents, устанавливает глубину поиска вниз по дереву ресурсов.
hideMenu 2 Надо ли отображать ресурсы у которых проставлен параметр скрывать из меню (hidemenu): 0 — показывать только видимые ресурсы; 1 — показывать только скрытые; 2 — показывать все.
contexts текущий контекст Контекст поиска. 
searchIndex search Имя REQUEST параметра которое будет использовать поиск.
offsetIndex sisea_offset Имя REQUEST параметра который используется для изменения страницы пагинации.
placeholderPrefix sisea. Префикс для плейсхолдера, устанавливаемого этим сниппетом (полезно если на сайте несколько поисков).  
toPlaceholder   Если установлено значение, все результаты будут записываться в плейсхолдер с указанным именем.
urlScheme   URL схема которую надо использовать: http, https, full, abs, relative, etc. Больше подробностей в документации MODX $modx->makeUrl(). Используется при генерации ссылок пагинации.
customPackages   Устанавливается для кастомизации поиска путем загрузки их пакетов. 
postHooks   Разделенный запятыми список постХуков, которые должны запуститься, для того чтобы добавить фасетный поиск к результатам.
activeFacet default Текущий активный фасет. Оставьте поле пустым, если хотите показывать результат в не стандартном фасете, полученном через postHook. 
facetLimit 5 Число не активных фасетов результатов, отображаемых на основной странице результатов. 
sortBy   Разделенный запятыми список полей ресурсов для сортировки результатов. Оставьте пустым для сортировки по релевантности.
sortDir DESC Разделенный запятыми список направлений сортировки результатов. Должно соответствовать количеству элементов в параметре sortBy.
noResultsTpl   Чанк использующийся когда поиск не дал никаких результатов.

Шаблоны SimpleSearch

&tpl — шаблон результатов поиска.

Доступные плейсхолдеры

[[+extract]] — если &showExtract установлен в 1, это будет извлеченная часть ресурса в которой найден поисковый запрос.

По умолчанию

<div class="sisea-result">
    <h3>[[+idx]]. <a href="[[+link:is=``:then=`[[~[[+id]]]]`:else=`[[+link]]`]]" title="[[+longtitle]]">[[+pagetitle]]</a></h3>
    <div class="extract"><p>[[+extract]]</p></div>
</div>

&containerTpl — шаблон обертки.

Доступные плейсхолдеры

[[+resultInfo]] — сообщение о том, как много результатов найдено

[[+results]] — результаты поиска.

[[+paging]] — ссылки пагинации.

По умолчанию

<p class="sisea-results">[[+resultInfo]]</p>
 
<div class="sisea-paging"><span class="sisea-result-pages">[[%sisea.result_pages? &namespace=`sisea` &topic=`default`]]</span>[[+paging]]</div>
 
<div class="sisea-results-list">
    [[+results]]
</div>
 
<div class="sisea-paging"><span class="sisea-result-pages">[[%sisea.result_pages? &namespace=`sisea` &topic=`default`]]</span>[[+paging]]</div>

&pageTpl — шаблон простых, неактивных, кликабельных ссылок пагинации.

Доступные плейсхолдеры

[[+text]] — текст или номер каждой страницы.

[[+separator]] — разделитель между номерами.

[[+link]] — адрес ссылки для пагинации.

По умолчанию

<span class="sisea-page"><a href="[[+link]]">[[+text]]</a>[[+separator]]</span>

&currentPageTpl — шаблон простых, активных, некликабельных ссылок пагинации.

Доступные плейсхолдеры

[[+text]] — текст или номер каждой страницы.

[[+separator]] — разделитель между номерами.

[[+link]] — тоже самое что text.

По умолчанию

<span class="sisea-page sisea-current-page">[[+text]]</span>