RealAdmin.ru

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

MODX
Категория: Сайтострой
03 Июл 2014 г. в 14:15

Почти любой сайт должен иметь такой функционал как поиск. Во всех 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».

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

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

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

                          Спасибо!

                          Но почему-то не работает сам поиск
                          1. avatar Руслан 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. avatar Simkin Andrew 26 февраля 2015, 18:51 #
                              попробуй без pdoPage
                              [[!pdoResources? 
                              	&parents=`0` 
                              	&resources=`[[!mSearch? &templates=`5` &returnIds=`1`]]` 
                              	&limit=`5` 
                              	&includeTVs=`thumb`
                              	&tpl=`articleTpl`
                              ]]
                            © REALADMIN.RU   2016 г.
                            Страница сгенерирована: 0,2135 s | 10 mb.
                            На каком уровне Вы играете в шахматы?
                            О П Р О С
                            Home Question Top