MODX. Поиск на сайте. Компонент SimpleSearch
Отредактировано: 06 Февраля 2023
Простейший поиск
Простейший путь для реализации поиска на сайте на cmf MODX реализуется через дополнение SimpleSearch. Для этого надо:
- Установить дополнение SimpleSearch;
- Создать новый ресурс, страницу на которой будет отображаться результат поиска:
- Имя: Результаты поиска;
- Псевдоним: search;
- Галки: «не показывать в меню» и «Оубликован»;
- Убрать галки: «Доступен для поиска», «Кешируемый»;
- В поле содержимого вставляем
[[!SimpleSearch]]
Запомните ID созданного ресурса — он нам еще понадобится.
- В шаблон, на место где должен находиться поиск вставляем следующий код:
[[!SimpleSearchForm? &landing=`1` &tpl=`tpl.search`]]
- &landing: ID созданной страницы;
- &tpl: шаблон формы поиска.
-
Создаем чанк 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>
¤tPageTpl — шаблон простых, активных, некликабельных ссылок пагинации.
Доступные плейсхолдеры
[[+text]] — текст или номер каждой страницы.
[[+separator]] — разделитель между номерами.
[[+link]] — тоже самое что text.
По умолчанию
<span class="sisea-page sisea-current-page">[[+text]]</span>
Здравствуйте!
Позвольте представиться, меня зовут Марина. Более 10 лет я занимаюсь обслуживанием сайтов и развитием интернет проектов. Если вы хотите избавиться от хлопот связанных с созданием и поддержкой сайта, тогда вы попали по адресу. При работе с сайтами я предоставляю качественные услуги, ориентируясь на ваши индивидуальные потребности. Для связи со мной воспользуйтесь формой обратной связи.