Поиск по сайту на MODX Revolution — mSearch

Поиск по сайту на MODX Revolution — mSearch
Комментарии: 30

Почти любой сайт должен иметь такой функционал как поиск. Во всех CMS есть для этого дополнения или компоненты, не стал исключением и MODX Revo. Самым популярным пакетом в MODX для этих целей является «SimpleSearch». Несмотря на это мы воспользуеся другим компонентом — «mSearch». Его преимущество заключается в учитывании при поиске морфологии русского языка, а так же в повышенной скорости работы.

поиск в modx revolution

К сожалению, у этого пакета есть и недостатки:

  • Во-первых, его нет в официальном репозитории 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».

Темы:
MODX
Ещё интересное — 6
Комментарии —
  1. Руслан Ю.
    Руслан Ю.26 января 2015, 16:01(был изменён)#
    Не плохой поиск.
    В статье не написано что желательно сделать вызов типа
    [[!mSearch?
      &indexer=`1`
      &offset=`0`
      &limit=`200`
    ]]
    
    Что бы прошла индексация страниц сайта
    И ещё косяк у этого поиска есть. Я его поставил в надежде что он будет искать если запрос набран на не правильной раскладке. А он в итоге выдает все подряд страницы. Причем даже если полную абракадабру написать.
    1. Andy Si26 января 2015, 16:47(был изменён)#
      Да, там есть косяк, что если вбить запрос, по которому ничего не найдено, то может выдать всё подряд. Я у себя это решил следующим образом:
      [[!pdoResources?
      	&parents=`0`
      	&resources=`[[!mSearch? &templates=`4` &returnIds=`1`]]`
      	&includeTVs=`img-news,tags,HitsPage`
      	&limit=`15`
      	&tpl=`articleTpl`
      	&tplWrapper=`@INLINE <h1>Результаты поиска по запросу: [[+mse.query]] ([[+total]])</h1> [[+total:isnot=`0`:then=`[[+output]]`]]`
      ]]
      То есть в tplWrapper проверяю, а нашлись ли результаты, и если нет, то вывожу сообщение об этом. Но с pdoPage мне так и не удалось настроить корректную работу. Сам Вася, который написал компонент — писал что он этими проблемами уже заниматься не будет, мол если хотите, то покупайте mSearch2. Такие дела.
      1. Руслан Ю
        Руслан Ю28 января 2015, 16:47#
        Спасибо так и сделал.
        1. Андрей
          Андрей02 августа 2015, 19:14(был изменён)#
          Я решил задачу так:
          [[+mse.error:is=``:then=`
          
              <div class="alert alert-info">Результаты поиска по запросу: [[+mse.query]]</div>
          
              [[!pdoPage? 
              	&elementClass=`modSnippet` 
              	&element=`pdoResources`
              	&parents=`0` 
              	&resources=`[[!mSearch? &templates=`4` &returnIds=`1`]]` 
              	&limit=`15` 
              	&tpl=`articleTpl`
              ]]
              <div class="wp-pagenavi">
              	[[!+page.nav]]
              </div>
          
          `:else=`<div class="alert alert-danger">[[+mse.error]]</div>`]]
          Если mSearch возвращает ошибку, то MODX не показывает результаты вообще, а отображает ошибку, содержащуюся в [[+mse.error]]. И это хорошо работает в связке с pdoPage.

          Если же mSearch ошибок не возвращает, то отображаются найденные документы.
          1. Andy Si02 августа 2015, 19:40#
            Спасибо, хорошее решение.
      2. Руслан Ю.
        Руслан Ю.26 января 2015, 16:28#
        Но всё же возможность искать только в определённых ресурсах и шаблонах это здорово!
        1. Руслан Ю
          Руслан Ю30 января 2015, 11:05#
          Андрей, здорова! Не в курсе как заставить mSearch не фильтровать в поисковом запросе символы типа \ _ / &. Симпл серч тоже самое творит. Выкидывает их из поискового запроса и соответственно ничего не находит.
          1. Andy Si30 января 2015, 15:45#
            Привет. Не знаю. Наверно где-то во внутренних механизмах. Да и эти символы все же не стоит разрешать, а то через форму поиска какую-нибдуь фигню пропишут, типа SQL инъекции.
            1. Олег
              Олег30 января 2015, 16:57(был изменён)#
              [удали, ошибся]
              1. Руслан Ю
                Руслан Ю30 января 2015, 20:28#
                Да уж жаль. Просто очень нужно было именно с этими символами поиск организовать. Ну да ладно значит поиск яндекса в будущем прикручу если он страницы нормально проиндексирует.
                1. Руслан Ю
                  Руслан Ю19 февраля 2015, 18:42#
                  Здорова, Андрей. Я решил гугл поиск поставить. Поиск хороший ищет не плохо. Но там реклама от Гугла обязательна похоже. Но за её показ вроде как деньги они платят. не вкурсе?
                  1. Andy Si19 февраля 2015, 19:14#
                    Привет. Вряд ли. Попробуй от Яндекса поиск, там нет никакой рекламы.
                    1. Руслан Ю
                      Руслан Ю19 февраля 2015, 19:31#
                      Я пробовал. Там с настройкой жесть. Это во-первых. Какой то пингер надо ставить на модекс. Я поставил сохранение ресурсов стало не корректно работать.
                      И ещё минус Яша индексирует дольше. Сайту 2х месяцев нет ещё. Он меня туго индексирует. Меньше половины страниц загнал. Гугл на этот счёт лучше.
                      1. Руслан Ю
                        Руслан Ю19 февраля 2015, 19:46#
                        потестил сей час вроде не выходит больше реклама. Она видимо редко будет выходить. Так что ничего страшного
              2. Олег
                Олег30 января 2015, 16:44#
                Почему-то пакет не загружается, его можно установить вручную? Как это сделать?
                1. Andy Si30 января 2015, 16:52(был изменён)#
                  Скачай в ручную, затем скопируй архив в /core/packages/. Зайди в установщик пакетов и вместо загрузить, выбери «Искать пакеты локально». Он тебе его найдет и тогда устанавливай. Ссылка на пакет — realadmin.ru/core/packages/msearch-1.5.2-pl.transport.zip
                  1. Олег
                    Олег30 января 2015, 16:58#
                    Благодарю! Установил.
                2. Руслан
                  Руслан26 февраля 2015, 16:41#
                  У меня при установке не распаковывается папка —
                  /core/components/msearch/phpmorphy/dicts/dict_ru.zip

                  Скажите пожалуйста, как самому распоковать? Не пойму куда именно распакованные файлы кидать. Можете глянуть у себя?
                  1. Andy Si26 февраля 2015, 17:07#
                    /core/components/msearch/phpmorphy/dicts/ тут лежат файлы .bin
                    /core/components/msearch/phpmorphy/src/ тут php файлы и ещё 3 подкаталога
                    1. Руслан
                      Руслан26 февраля 2015, 17:11#
                      Спасибо!
                  2. Руслан
                    Руслан26 февраля 2015, 16:47#
                    пробовал вручную установить, не может распоковать архив со словарем морфологическим

                    Could not extract dictionaries to /*******/core/components/msearch/phpmorphy/dicts/
                    1. Andy Si26 февраля 2015, 17:08#
                      прав наверно каких-то не хватает
                      1. Max
                        Max27 февраля 2015, 20:35#
                        Можно вручную распаковать в /core/components/msearch/phpmorphy/dicts/. Адрес архива из инета в ошибке показывается…
                      2. Руслан
                        Руслан26 февраля 2015, 17:12#
                        Скажите, а как посмотреть параметры, свойства сниппета? В документации написано, но не написано как сделать это.
                        1. Andy Si26 февраля 2015, 17:27(был изменён)#
                          Как что сделать? Как использовать их? Как во всех сниппетах. В статье есть примеры. Либо можешь попробовать открыть ресурс какой-нибдуь и перетащить в поле контента сниппет mSearch. Появится окно со всеми свойствами сниппета, которые можно сразу заполнить, а контенте ресурса автоматически сгенерируется сниппет со всеми заполненными параметрами.
                        2. Руслан
                          Руслан26 февраля 2015, 17:34#
                          Круто! Даже не знал о такой возможности, а то собирался в код сниппет а лезть

                          Спасибо!

                          Но почему-то не работает сам поиск
                          1. Руслан
                            Руслан26 февраля 2015, 17:41(был изменён)#
                            В контент ресурса вставил. Ресурсы для поиска уже проиндексировал.
                            Но всегда пишет, что найдено 0, но выводит одни и те же результаты

                            <form  action="[[~1557]]" method="GET">
                            	<input type="text" name="query" maxlength="40" value="[[+mse.query]]" placeholder="Найти" /> 
                            	<input type="submit" value="Найти" />
                            </form>
                            
                            
                            
                            Результаты поиска по запросу: [[+mse.query]] ([[+total]]) [[+mse.error]]
                            
                            [[!pdoPage? 
                            	&elementClass=`modSnippet` 
                            	&element=`pdoResources` 
                            	&parents=`0` 
                            	&resources=`[[!mSearch? &templates=`5` &returnIds=`1`]]` 
                            	&limit=`5` 
                            	&includeTVs=`thumb`
                            	&tpl=`articleTpl`
                            ]]
                            
                            <div class="wp-pagenavi">
                            	[[!+page.nav]]
                            </div>
                            1. Andy Si26 февраля 2015, 18:51#
                              попробуй без pdoPage
                              [[!pdoResources? 
                              	&parents=`0` 
                              	&resources=`[[!mSearch? &templates=`5` &returnIds=`1`]]` 
                              	&limit=`5` 
                              	&includeTVs=`thumb`
                              	&tpl=`articleTpl`
                              ]]
                            2. Аркадий
                              Аркадий22 января 2018, 18:07#
                              Вот еще халява, рабочая)

                              https://github.com/werwolf41/tortilla/blob/master/core/packages/msearch2-1.8.3-pl.transport.zip
                              1. Andy Si25 января 2018, 14:59#
                                Классно, но я бы не стал распространять бесплатно. Василий через него практически получает донат за свои вклады в развитие modx сообщества.
                              © REALADMIN.RU   2024 г.
                              Страница сгенерирована: 0,1991 s | 6 mb.
                              На каком уровне Вы играете в шахматы?
                              OPROS