Поиск по сайту на MODX Revolution — mSearch
Почти любой сайт должен иметь такой функционал как поиск. Во всех CMS есть для этого дополнения или компоненты, не стал исключением и MODX Revo. Самым популярным пакетом в MODX для этих целей является «SimpleSearch». Несмотря на это мы воспользуеся другим компонентом — «mSearch». Его преимущество заключается в учитывании при поиске морфологии русского языка, а так же в повышенной скорости работы.
К сожалению, у этого пакета есть и недостатки:
- Во-первых, его нет в официальном репозитории MODX. Тем не менее, его можно без проблем найти через поисковые системы, либо скачать по этой ссылке.
- Во-вторых, автор прекратил его поддержку, переписал компонент заново, назвал его «mSearch2» и теперь он платный. Тем не менее, я настроил старую версию и она прекрасно работает.
- В-третьих, у него есть проблемы с выводом TV параметров при выдаче результатов, но мы обойдём это хитрым способом.
Создание страницы для вывода результатов поиска в MODX
Устанавливаем дополнения «mSearch» и «pdoTools». Второе дополнение есть в официальном репозитории MODX. Из него нам потребуется сниппет «pdoResources», хотя вполне можно вместо него использовать и «getResources». Это на ваше усмотрение.
Затем создадим страницу (ресурс), которая будет отвечать за вывод результатов поиска. Шаблон для этого ресурса в большинстве случаев подходит стандартный, требование одно — основное место в нём должно выделяться под содержимое ресурса. В содержимом страницы вызываем сниппет «pdoResources», в параметре к которому передаём id найденных ресурсов сниппетом «mSearch»:
Результаты поиска по запросу: [[+mse.query]] ([[+total]]) [[!pdoResources? &parents=`0` &resources=`[[!mSearch? &templates=`4` &returnIds=`1`]]` &limit=`15` &includeTVs=`img-news,tags,HitsPage` &tpl=`articleTpl` ]] [[+mse.error]]
В этом примере мы немного извратились. По идее, сам сниппет поиска может выводить результаты, но на деле он некорректно отображает связанные с ресурсом TV параметры. Точнее он их отображает только для первого найденного ресурса. Чтобы обойти это мы настроили «mSearch» так, чтобы он выдал только id найденных ресурсов, а их вывод и оформление мы осуществляем через «pdoResources».
Используемые плейсхолдеры и параметры:
- [[+mse.query]] — плейсхолдер выводит строку запроса.
- [[+total]] — выводит количество найденых ресурсов.
- [[+mse.error]] — выводит ошибки, например при отсутствии найденных ресурсов выведет об этом сообщение.
- &templates=`4` — параметр задаёт поиск только среди ресурсов с этими номерами шаблонов, через запятую. Если требуется искать по всему сайту, указываем все шаблоны. Так же вместо этого параметра можно использовать &parents, в котором потребуется указать список ресурсов-родителей, в которых будет производиться поиск.
- &returnIds=`1` — указывает на то, что требуется вернуть id найденных страниц.
- &tpl=`articleTpl` — параметр сниппета «pdoResources» — указывает чанк для оформления результата вывода одной страницы. В нём можно вывести название ресурса, TV параметры и.т.п. Например:
<div class="resultSearch"> <img class="tv_img" src="[[+tv.img-news]]" alt="[[+tv.tags]]"> <a href="[[++site_url]][[~[[+id]]]]">[[+pagetitle]]</a> <p>[[+description]] ...</p> </div>
Создание формы поиска
Осталось передать созданной странице параметр, через который сниппет «mSearch» узнает, что именно надо искать. Для этого в любом месте сайта располагаем следующий код:
<form action="[[++site_url]][[~20]]" method="GET"> <input type="text" name="query" maxlength="40" value="" placeholder="Найти" /> <input type="submit" value="Найти" /> </form>
Как вы наверно догадались, [[~20]] это id страницы, которую мы создали на предыдущем шаге. Вся задача этой формы — отправить ей методом «GET» или «POST» параметр «query». Можно приступать к тестированию, так как основная часть поиска на MODX закончена.
Вывод результатов с постраничной пагинацией
Если в выдаче очень много ресурсов, то целесообразно использовать постраничный вывод. Для этого можно использовать сниппет «getPage» или «pdoPage». Последний входит в состав дополнения «pdoTools», поэтому пример именно с ним:
[[!pdoPage? &elementClass=`modSnippet` &element=`pdoResources` &parents=`0` &resources=`[[!mSearch? &templates=`4` &returnIds=`1`]]` &limit=`5` &includeTVs=`img-news,tags,HitsPage` &tpl=`articleTpl` ]] <div class="wp-pagenavi"> [[!+page.nav]] </div>
Форма поиска должна обязательно передавать параметр «query» методом «GET».
В статье не написано что желательно сделать вызов типа
Что бы прошла индексация страниц сайта
И ещё косяк у этого поиска есть. Я его поставил в надежде что он будет искать если запрос набран на не правильной раскладке. А он в итоге выдает все подряд страницы. Причем даже если полную абракадабру написать.
То есть в tplWrapper проверяю, а нашлись ли результаты, и если нет, то вывожу сообщение об этом. Но с pdoPage мне так и не удалось настроить корректную работу. Сам Вася, который написал компонент — писал что он этими проблемами уже заниматься не будет, мол если хотите, то покупайте mSearch2. Такие дела.
Если mSearch возвращает ошибку, то MODX не показывает результаты вообще, а отображает ошибку, содержащуюся в [[+mse.error]]. И это хорошо работает в связке с pdoPage.
Если же mSearch ошибок не возвращает, то отображаются найденные документы.
И ещё минус Яша индексирует дольше. Сайту 2х месяцев нет ещё. Он меня туго индексирует. Меньше половины страниц загнал. Гугл на этот счёт лучше.
/core/components/msearch/phpmorphy/dicts/dict_ru.zip
Скажите пожалуйста, как самому распоковать? Не пойму куда именно распакованные файлы кидать. Можете глянуть у себя?
/core/components/msearch/phpmorphy/src/ тут php файлы и ещё 3 подкаталога
Could not extract dictionaries to /*******/core/components/msearch/phpmorphy/dicts/
Спасибо!
Но почему-то не работает сам поиск
Но всегда пишет, что найдено 0, но выводит одни и те же результаты
https://github.com/werwolf41/tortilla/blob/master/core/packages/msearch2-1.8.3-pl.transport.zip