Сегодня урок о том как в 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
- Устанавливаем и активируем пакет SimpleSearch с основного репозитория.
- Создаем страницу с результатами поиска, отключаем у нее html редактор и вызываем сниппет
[[!SimpleSearch]]
и запоминаем ID ресурса.
- В месте где нужно вывести форму поиска вызываем сниппет:
[[!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` ¤tPageTpl=`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`
¤tPageTpl=`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.
Если есть вопросы, пишите задавайте их в комментариях.
Почему-то, при установке параметра &andTerms=`0` — перестают работать параметры: hideMenu, ids. Может кто знает как победить? А то начинают показываться страницы, которые показывать не нужно
Опечатка в таблице. У параметра «containerTpl» сниппета «SimpleSearch» значение по умолчанию не «SearchResult», а «SearchResults», букву «s» на конце забыли
Ага, спасибо. Поправил
Отличное решение для fenom. На его же основе сделал систему тегов на сайте. С условиями для where всегда много мороки, особенно если они комплексные. Не понял пока только как сделать поиск регистронезависимым.
Есть информация почему когда ввожу цифры он их не ищет, просто пропускает
Не знаю)
Автору спасибо, интересное решение, в сети мало полезной информации пока найдёшь зарастёшь мхом, давно пользую дополнение SimpleSearch очень хорошо и быстро работает, и благо что есть подобные руководства которые облегчают установку и настройку поиска, не так давно реализовал на одной из страниц сайта с помощью simplesearch ajax поиск, тут: https://itchief.ru/questions/607 подробно описано как это сделать, работает без перезагрузки страницы и тоже быстро.
Ну да достаточно не плохое решение, если жалко денег на msearch2)