SimpleSearch — поиск по сайту

MODX Revo

Сегодня урок о том как в Modx Revolution реализовать поиск по сайту при помощи компонента SimpleSearch.

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

SimpleSearch имеет 2 сниппета — один для отображения формы («SimpleSearchForm»), а другой для отображения результатов поиска («SimpleSearch»). Рассмотрим их параметры.

Параметры сниппета SimpleSearch

Имя Описание По умолчанию
tpl Часть, которая используется для отображения содержимого каждого результата поиска. SearchResult
containerTpl Блок, который используется для обертывания результатов поиска, разбивки на страницы и сообщения. SearchResults
useAllWords Если true, будут найдены только результаты со всеми указанными словами поиска. 0
maxWords Максимальное количество слов для включения в поиск. Только применимо, если useAllWords выключен. 7
minChars Минимальное количество символов для запуска поиска. 3
searchStyle Чтобы выполнить поиск с помощью «частичного» поиска LIKE или поиска соответствия «соответствие», основанного на релевантности. partial
andTerms Нужно ли добавлять логическое И между словами. 1
matchWildcard Включить поиск подстановочных знаков. Установите значение false, чтобы выполнить точный поиск по поисковому запросу. 1
docFields Список отдельных полей документов для поиска. pagetitle,
longtitle,
description,
introtext,
alias,
,content
fieldPotency Оценка и сортировка результатов
perPage Кол-во результатов поиска для одной страницы. 10
showExtract Показывать ли вырез содержимого каждого результата поиска. 1
extractSource Позволяет пользователю определять, откуда происходит извлечение. Если значением этого параметра является имя поля ресурса (включая ТВ, если установлено & includeTVs), то это поле ресурса используется для выписки. В противном случае параметр берется как имя выполняемого фрагмента. Фрагмент передается массивом ресурсов в качестве параметров. Если у этого имени нет фрагмента, то экстракт будет пустым. content
extractLength Количество символов для извлечения из содержимого для каждого результата. 200
extractEllipsis Строка, используемая для переноса результатов извлечения. По умолчанию используется многоточие.
includeTVs Указывает, должны ли значения TemplateVar быть включены в свойства, доступные для каждого шаблона ресурса. По умолчанию 0. Включение этого параметра может замедлить работу, если у вас много Дополнительных полей. 0
processTVs Указывает, должны ли значения TemplateVar быть отображены так, как они были бы на суммированном ресурсе. По умолчанию 0. Некоторые примечания: к ТВ можно получить доступ по имени своего ТВ [[+myTV]] По умолчанию SimpleSearch не использует префикс, например [[+ tv.myTV]] НЕ будет отображаться.
ТВ обрабатываются во время индексирования для поиска Solr, поэтому здесь нет необходимости делать это.
0
highlightResults Укажите или не выделите поисковый запрос в результатах. 1
highlightClass Имя класса CSS для добавления к выделенным условиям в результатах. sisea-highlight
highlightTag Тег html для обертывания выделенного термина в результатах поиска. span
pageTpl Часть, используемая для ссылки на страницы. PageLink
currentPageTpl Блок, используемый для текущей ссылки на странице. CurrentPageLink
pagingSeparator Сепаратор (разделитель) для использования между ссылками на страницы. |
ids Список ID документов, через запятую, для ограничения поиска
idType Тип ограничения для параметра ids. Если родители, то все элементы идентификаторов будут добавлены в параметр ids для поиска. Если документы, будут использоваться только указанные идентификаторы в поиске. parents
exclude Список идентификаторов ресурсов, через запятую, для исключения из поиска, например. «10,15,19». Это исключает ресурсы с идентификаторами «10», «15» или «19».
depth Если для idtype задано значение для родителей, глубина вниз по дереву ресурсов, которая будет искать с указанными идентификаторами. 10
hideMenu Нужно ли возвращать Ресурсы, на которых есть hidemenu. 0 показывает только видимые ресурсы, 1 показывает только скрытые ресурсы, 2 показывает оба. 2
contexts Контексты поиска. По умолчанию используется текущий контекст, если ни один из них не указан явно.
searchIndex Имя параметра REQUEST, который будет использоваться поиском. search
offsetIndex Имя параметра REQUEST, используемого для смещения страницы. sisea_offset
placeholderPrefix Префикс для глобальных заполнителей, заданный снипетом. sisea.
toPlaceholder Нужно ли устанавливать вывод для прямого возврата или установить в заполнитель с именем этого свойства.
urlScheme Необходимая схема URL: http, https, full, abs, relative и т.д. См. документацию $modx->makeUrl(). Это используется, когда генерируются ссылки для разбивки на страницы.
customPackages Установите для поиска пользовательских таблиц, загрузив их пакет. Подробности смотрите ниже.
postHooks Перечисленный запятыми список хуков для запуска, которые могут добавлять граненные множества к конечным результатам.
activeFacet Текущая активная грань. Оставьте это самостоятельно, если вы не хотите, чтобы результат показывался с нестандартного аспекта, полученного через postHook. default
facetLimit Количество результатов non-active-facet для отображения на главной странице результатов. 5
sortBy Список полей ресурсов, через запятую, для сортировки результатов. Оставьте поле пустым для сортировки по релевантности и оценке.
sortDir Список инструкций для сортировки результатов, разделенных запятыми. Должно соответствовать количеству элементов в параметре sortBy. DESC
noResultsTpl Чанк для использования, если результаты поиска не найдены.

Параметры сниппета SimpleSearchForm

Имя Описание По умолчанию
tpl Чанк, который будет использоваться для отображения формы поиска. SearchForm
landing Ресурс, на котором вызывается сниппет SimpleSearch, который отображает результаты поиска.
searchIndex Имя параметра REQUEST, который будет использовать поиск. search
method Следует ли отправлять поиск через POST или GET. GET
toPlaceholder Укажите, следует ли установить вывод для прямого возврата или установить заполнитель с этим именем свойства.

Реализация поиска на сайте MODX

  1. Устанавливаем и активируем пакет SimpleSearch с основного репозитория.
  2. Создаем страницу с результатами поиска, отключаем у нее html редактор и вызываем сниппет [[!SimpleSearch]] и запоминаем ID ресурса.
    Создание страницы с результатами поиска
  3. В месте где нужно вывести форму поиска вызываем сниппет:[[!SimpleSearchForm? &landing=`39`]], где 39 это id ресурса с результатами поиска.

Меняем внешний вид формы поиска

За html разметку формы поиска отвечает чанк: SearchForm, сделаем его копию и назовем SearchFormNew
Создаем копию чанкаТеперь открываем копию чанка и подгоняем разметку под свою, к примеру у меня получилось такое код чанка:

<form role="search" class="simplesearch-search-form search-form" action="[[~[[+landing]]]]" method="[[+method]]"> 
    <label for="[[+searchIndex]]">
        <input type="text" name="[[+searchIndex]]" id="[[+searchIndex]]" class="search-field" placeholder="Поиск..." value="[[+searchValue]]">
        <input type="hidden" name="id" value="[[+landing]]" />
    </label>
    <input type="submit" class="search-submit" value="Найти">
</form>

Далее указываем в вызове этот чанк:

[[!SimpleSearchForm? &landing=`39` &tpl=`SearchFormNew`]]

Меняем внешний вид результатов поиска

В принципе по умолчанию результаты поиска выглядят довольно адекватно (по крайней мере в моем случае).

вид результатов поиска

За результаты поиска отвечает сниппет SimpleSearch в котором обрабатываются 4 чанка:

  • tpl (SearchResult) — используется для каждого отображаемого результата.
  • containerTpl (SearchResults) — используется для обертывания всех результатов поиска, разбивки на страницы и сообщения.
  • pageTpl (PageLink) — используется для ссылки на страницы.
  • currentPageTpl (CurrentPageLink) — используется для вывода текущей ссылки на страницы.

Сделаем копии этих 4х чанков (указаны в кавычках) и добавим к их названиям префиксы New.

Копии созданных чанков

Теперь можно изменить вызов с [[!SimpleSearch]] на

[[!SimpleSearch? &tpl=`SearchResultNew` &containerTpl=`SearchResultsNew` &pageTpl=`PageLinkNew` &currentPageTpl=`CurrentPageLinkNew`]]

Если сейчас произвести поиск, то результаты будут такими же — т.к. по факту не чего не изменилось — мы выводим точно такие же как и оригинальные чанки.

Давайте разберем каждый из этих чанков — чтобы вы понимали что и за что отвечает.

Начнем с обвертки результатов: SearchResultsNew, стандартная разметка у него следующая:

<p class="simplesearch-results">[[+resultInfo]]</p>

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

<div class="simplesearch-results-list">
    [[+results]]
</div>

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

Здесь:

  • [[+resultInfo]] — инф-я о кол-ве найденных документов и по какому словосочетанию
  • [[+sisea.result_pages? &namespace=`sisea` &topic=`default`]] — вывод фразы «Страницы с результатами поиска:»
  • [[+results]] — результаты поиска
  • [[%simplesearch.result_pages? &namespace=`simplesearch` &topic=`default`]] — вывод фразы «Страницы с результатами поиска:»
  • [[+paging]] — пагинация

Давайте добавим картинки в результаты поиска и сделаем разметку результатов под бутстрап 4 сетку. Для этого допишем в конце вызова &includeTVs=`1` &processTVs=`1`

[[!SimpleSearch? 
    &tpl=`SearchResultNew` 
    &containerTpl=`SearchResultsNew` 
    &pageTpl=`PageLinkNew` 
    &currentPageTpl=`CurrentPageLinkNew`
    &includeTVs=`1` 
    &processTVs=`1`
]]

И в чанке заменим данный кусок кода

<div class="simplesearch-results-list"> [[+results]] </div>

На <div class="row">[[+results]]</div>

Теперь откроем чанк SearchResultNew, его стандартный код такой:

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

Здесь:

  • [[+idx]] — номер результата поиска в списке
  • [[+link:is=«:then=`[[~[[+id]]]]`:else=`[[+link]]`]] — ссылка на документ (модификатор).
  • [[+longtitle]] — расширенный заголовок
  • [[+pagetitle]] — заголовок
  • [[+extract]] — текст, по которому был найден этот документ

Поменяем разметку под бутстрап + добавим картинку (TV поле с картинкой в моем случае имеет имя image), получим примерно следующее:

<div class="col-12 mb-3">
    <a href="[[+link:is=``:then=`[[~[[+id]]]]`:else=`[[+link]]`]]" title="[[+longtitle]]">
        <img src="[[+image:pthumb=`w=195&h=115&zc=1`]]" alt="[[+pagetitle]]" class="img-fluid mt-2" style="float:left;padding-right:15px"> 
        <h3>[[+pagetitle]]</h3>
    </a>
    <p>[[+extract]]</p>
</div>

Новый вид результатов поиска

В вызове я сделал обрезку картинки при помощи пакета pthumb:  [[+image:pthumb=`w=195&h=115&zc=1`]] — учитывайте это можно сделать просто [[+image]].

Ну и давайте разберем 2 оставшихся чанка.

PageLinkNew :

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

Здесь:

  • [[+link]] — ссылка на документ;
  • [[+text]] — номер документа.

И CurrentPageLinkNew

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

Где [[+text]] вывод текущей ссылки на страницу.

В принципе все. Официальная документация по компоненту здесь. Меняйте под себя все что вам нужно.

Так же если ваш сайт использует jQuery, то вы можете настроить автозаполнение (живой поиск), для этого смотрите Github.

На сайтах которых работают на шаблонизаторе феном я обычно делаю поиск при помощи PdoTools.

Если есть вопросы, пишите задавайте их в комментариях.

Поделиться с друзьями
Алексей

Веб-дизайнер и SEO оптимизатор. Занимаюсь созданием сайтов с 2010 года и их продвижение с 2012 года!

Оцените автора
( 6 оценок, среднее 4.67 из 5 )
Web-Revenue.ru
Добавить комментарий

  1. Степан

    Почему-то, при установке параметра &andTerms=`0` — перестают работать параметры: hideMenu, ids. Может кто знает как победить? А то начинают показываться страницы, которые показывать не нужно

    Ответить
  2. Степан

    Опечатка в таблице. У параметра «containerTpl» сниппета «SimpleSearch» значение по умолчанию не «SearchResult», а «SearchResults», букву «s» на конце забыли

    Ответить
    1. Алексей автор

      Ага, спасибо. Поправил

      Ответить
  3. Алексей

    Отличное решение для fenom. На его же основе сделал систему тегов на сайте. С условиями для where всегда много мороки, особенно если они комплексные. Не понял пока только как сделать поиск регистронезависимым.

    Ответить
  4. петя

    Есть информация почему когда ввожу цифры он их не ищет, просто пропускает

    Ответить
    1. Алексей автор

      Не знаю)

      Ответить
  5. Алексей

    Автору спасибо, интересное решение, в сети мало полезной информации пока найдёшь зарастёшь мхом, давно пользую дополнение SimpleSearch очень хорошо и быстро работает, и благо что есть подобные руководства которые облегчают установку и настройку поиска, не так давно реализовал на одной из страниц сайта с помощью simplesearch ajax поиск, тут: https://itchief.ru/questions/607 подробно описано как это сделать, работает без перезагрузки страницы и тоже быстро.

    Ответить
    1. Алексей автор

      Ну да достаточно не плохое решение, если жалко денег на msearch2)

      Ответить