
mSearch
Сниппет для поиска и вывода результатов.
Использует pdoTools для вывода, поэтому поддерживает все основные возможности: подключение TV, указание условий в &where и т.д.
Некэшируемый вызов
Сниппет должен вызываться некэшированно (с !), так как реагирует на поисковый запрос из $_REQUEST.
Параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
| query | $_REQUEST['mse_query'] | Поисковый запрос |
| tpl | mSearch.row | Чанк оформления для каждого результата |
| tplWrapper | Чанк-обёртка для всех результатов | |
| limit | 10 | Лимит результатов |
| offset | 0 | Смещение для пагинации |
| outputSeparator | \n | Разделитель между результатами |
| toPlaceholder | Сохранить результаты в плейсхолдер вместо вывода | |
| return | chunks | Формат вывода: chunks, ids, json, data |
Параметр return
| Значение | Описание |
|---|---|
chunks | Вывод через чанки (по умолчанию) |
ids | Только ID найденных ресурсов через запятую |
json | JSON массив с данными ресурсов |
data | Массив данных (для использования в других сниппетах) |
Плейсхолдеры
Глобальные плейсхолдеры
После выполнения сниппет устанавливает:
| Плейсхолдер | Описание |
|---|---|
[[+mse.total]] | Общее количество найденных результатов |
[[+mse.query]] | Поисковый запрос |
Плейсхолдеры в чанке tpl
| Плейсхолдер | Описание |
|---|---|
[[+id]] | ID ресурса |
[[+pagetitle]] | Заголовок |
[[+longtitle]] | Расширенный заголовок |
[[+introtext]] | Вводный текст |
[[+content]] | Содержимое |
[[+weight]] | Релевантность (вес) результата |
[[+intro]] | Текст с подсвеченными совпадениями |
[[+idx]] | Порядковый номер в списке |
| и другие поля ресурса... |
Плейсхолдеры в чанке tplWrapper
| Плейсхолдер | Описание |
|---|---|
[[+output]] | Все результаты |
[[+total]] | Количество результатов |
[[+query]] | Поисковый запрос |
Примеры
Базовый вызов
{'!mSearch' | snippet}С кастомным чанком
{'!mSearch' | snippet : [
'tpl' => 'mySearchResult',
'limit' => 20
]}С обёрткой
{'!mSearch' | snippet : [
'tpl' => 'mSearch.row',
'tplWrapper' => 'mSearch.wrapper',
'limit' => 10
]}Чанк mSearch.wrapper:
{if $total > 0}
<div class="search-results">
<p>Найдено результатов: {$total} по запросу "{$query}"</p>
<div class="results-list">
{$output}
</div>
</div>
{else}
<p>Ничего не найдено</p>
{/if}С пагинацией через pdoPage
{'!pdoPage' | snippet : [
'element' => 'mSearch',
'tpl' => 'mSearch.row',
'limit' => 10
]}
{$_modx->getPlaceholder('page.nav')}Получение только ID
Полезно для передачи в другие сниппеты:
{set $ids = '!mSearch' | snippet : [
'return' => 'ids',
'limit' => 0
]}
{if $ids}
{'msProducts' | snippet : [
'resources' => $ids,
'sortby' => 'ids'
]}
{else}
<p>Товары не найдены</p>
{/if}Поиск товаров MiniShop3
{'!pdoPage' | snippet : [
'element' => 'msProducts',
'parents' => 0,
'resources' => '!mSearch' | snippet : ['return' => 'ids', 'limit' => 0] | default : '999999',
'sortby' => 'ids',
'tpl' => 'tpl.msProducts.row'
]}
{$_modx->getPlaceholder('page.nav')}Фильтр default
Фильтр | default : '999999' подставляет несуществующий ID, если поиск не дал результатов. Это предотвращает вывод всех товаров при пустом запросе.
JSON для AJAX
{'!mSearch' | snippet : [
'return' => 'json',
'limit' => 5
]}Чанк по умолчанию
Чанк mSearch.row:
<div class="search-result">
<h3>
<a href="{$id | url}">{$pagetitle}</a>
<span class="weight">{$weight}</span>
</h3>
{if $intro}
<p class="intro">{$intro}</p>
{/if}
</div>Подсветка результатов
Плейсхолдер [[+intro]] содержит фрагмент текста с подсвеченными найденными словами. По умолчанию слова оборачиваются в <mark>.
Настройки подсветки (через сервис Highlighter):
- Максимальная длина фрагмента: 200 символов
- Текст обрезается с многоточием вокруг первого совпадения
Алгоритм поиска
- Разбиение запроса — запрос разбивается на слова
- Обработка алиасов — применяются синонимы и замены
- Морфологический анализ — для каждого слова ищутся базовые формы
- Поиск в индексе — поиск слов в таблице индекса
- LIKE-поиск — дополнительный поиск по полному тексту
- Применение бонусов — добавление веса за точные совпадения
- Сортировка — результаты сортируются по релевантности
События
Сниппет вызывает события:
- mseOnBeforeSearch — перед поиском, можно модифицировать запрос
- mseOnAfterSearch — после поиска, можно модифицировать результаты
