MODX Revo - Создание поиска для блога
На этом уроке мы создадим для нашего блога, который работает под управлением CMF MODX Revolution, систему поиска с помощью компонента mSearch.
Создание системы поиска для блога
Скачаем и установим компонент "mSearch".
Проиндексируем страницы нашего сайта.
Индексация существующих страниц блога осуществляется посредством нижеприведённого кода, который необходимо добавить в любой шаблон.
[[!mSearch? &indexer=`1` &offset=`1` &limit=`500` ]]
После этого необходимо открыть любую страницу, которая использует данный шаблон, в браузере.
Например, вставим вышеприведённый код в содержимое главной страницы:
Откроем главную страницу нашего блога и увидим результат индексирования ресурсов сниппетом mSearch:
После этого данный код можно удалить из содержимого главной страницы.
Во время исполнения данный сниппет проиндексирует первые 500 ресурсов нашего блога. Первый параметр (
indexer
) указывает на то, что сниппетmSearch
будет выполнять не поиск, а индексацию ресурсов блога. Второй и третий параметр (offset
иlimit
) задаёт ограничение на выборку ресурсов, которые необходимо проиндексировать. Если на Вашем блоге содержится больше чем 500 ресурсов (например, 1200), то производить их индексацию придётся в несколько запусков:Индексацию ресурсов достаточно выполнить только один раз, после установки компонента
mSearch
. Ресурсы, которые будут добавляться уже после установки компонентаmSearch
индексировать с помощью сниппета не надо. Они будут индексироваться автоматически с помощью плагина, который идёт в комплекте с данным компонентом.Изменим название плейсхолдеру
total
в сниппетеmSearch
. Это необходимо сделать для того, чтобы избежать конфликтов, т.к. данное имя плейсхолдера также использует компонентTickets
.Создадим ресурс (страницу) "Поиск" и запомним его идентификатор (
id
). В дальнейшем он нам пригодится для создания формы поиска.Создадим шаблон "Поиск".
Скопируем код из любого другого шаблона (например, блог). Удалим из него лишний код, т.е. оставим только код, формирующий основную структуру веб-страницы.
<!DOCTYPE html> <html lang="ru"> [[$chunk.head]] <body> <div class="container"> <div class="row"> [[$chunk.header]] [[$chunk.navbar]] <div class="main-block col-md-8"> <h1 class="h2 page-header">[[*pagetitle]]</h1> </div> <div class="col-md-4"> </div> </div> </div> [[$chunk.footer]] </body> </html>
Разработаем форму поиска:
<!-- Контейнер, который будет содержать форму --> <div class="well"> <!-- Форма поиска --> <!-- 14 - это id ресурса, в котором будут отображаться результаты поиска --> <form action="[[++site_url]][[~14]]" method="get"> <div class="row"> <div class="form-group col-md-10"> <input id="inputSearch" type="text" class="form-control" name="query" maxlength="50" value="[[+mse.query]]" placeholder="Найти"> </div> <button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-search"></i> Поиск</button> </div> </form> </div>
Разработаем код, который будет выводить результаты поиска с помощью сниппетов
pdoResources
иmSearch
:[[!pdoResources? &parents=`2` &showHidden=`1` &resources=`[[!mSearch? &parents=`2` &showHidden=`1` &returnIds=`1`]]` &limit=`10` &tpl=`searchTpl` &tplWrapper=`@INLINE <h2 class="h3 page-header">Результаты поиска по запросу: [[+mse.query]] ([[+mse.total]])</h2> [[+mse.total:isnot=`0`:and:isnot=``:then=`[[+output]]`]]` ]]
где:
parents=`2` - указывает сниппету mSearch на то, что поиск необходимо производить только в ресурсах, имеющих в качестве родителя ресурс с
id=2
.&showHidden=`1` - указывает сниппетам на то, что необходимо выбирать ресурсы, скрытые для меню.
returnIds=`1` - указывает сниппету mSearch на то, что необходимо возвращать вместо оформленных результатов идентификаторы (
id
) ресурсов.tpl=`searchTpl` - указываем сниппету pdoResources на то, что в качестве шаблона для вывода каждого найденного результата (ресурса) необходимо использовать чанк
searchTpl
.limit=`10` - указывает сниппету pdoResources на то, что необходимо ограничить количество результатов выборки до 10.
resources - указывает сниппету pdoResources на то, что необходимо использовать ресурсы предоставленные сниппетом mSearch.
tplWrapper - шаблон, который предназначен для оборачивания результатов работы сниппета pdoResources. Код
[[+mse.total...
выполняет следующее: он проверяет, не является ли значение плейсхолдера[[+mse.total]]
равным нулю и пустой строке. Если это условие выполняется, то выводятся результаты работы сниппета с помощью плейсхолдера[[+output]]
. В противном случае ничего не выводится. Данное условие необходимо из-за того, что когда сниппет mSearch не находит не один подходящий ресурс, то он выводит все ресурсы сайта.[[+mse.total]] - плейсхолдер, который содержит число найденных ресурсов сниппетом mSearch.
[[+mse.query]] - плейсхолдер, который содержит текст запроса.
Итоговый код шаблона "Поиск":
<!DOCTYPE html> <html lang="ru"> [[$chunk.head]] <body> <div class="container"> <div class="row"> [[$chunk.header]] [[$chunk.navbar]] <div class="main-block col-md-8"> <h1 class="h2 page-header">[[*pagetitle]]</h1> <div class="well"> <form action="[[++site_url]][[~14]]" method="get"> <div class="row"> <div class="form-group col-md-10"> <input id="inputSearch" type="text" class="form-control" name="query" maxlength="50" value="[[+mse.query]]" placeholder="Найти"> </div> <button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-search"></i> Поиск</button> </div> </form> </div> [[!pdoResources? &parents=`2` &showHidden=`1` &resources=`[[!mSearch? &parents=`2` &showHidden=`1` &returnIds=`1`]]` &limit=`10` &tpl=`searchTpl` &tplWrapper=`@INLINE <h2 class="h3 page-header">Результаты поиска по запросу: [[+mse.query]] ([[+mse.total]])</h2> [[+mse.total:isnot=`0`:and:isnot=``:then=`[[+output]]`]]` ]] </div> <div class="col-md-4"> </div> </div> </div> [[$chunk.footer]] </body> </html>
Создадим чанк
searchTpl со следующим содержимым: <div class="panel panel-default"> <div class="panel-body"> <a href="[[++site_url]][[~[[+id]]]]">[[+pagetitle]]</a> </div> <div class="panel-footer">[[+description]]</div> </div>
Установим ресурсу (странице) "Поиск" шаблон "Поиск".
Создадим форму "Поиск" для остальных страниц блога.
Создадим чанк "search" со следующим содержимым:
<div class="last-comment"> <h4 class="page-header text-center">Поиск</h4> <form action="[[++site_url]][[~14]]" method="get"> <div class="input-group"> <input type="text" class="form-control" name="query" maxlength="50" value="" placeholder="Найти"> <span class="input-group-btn"> <button type="submit" class="btn btn-default">Найти</button> </span> </div> </form> </div>
Добавим чанк "search" в необходимые шаблоны нашего блога:
Результаты урока представим в виде следующих изображений:



Но его можно загрузить и установить вручную.
Ссылка для загрузки msearch-1.5.2-pl.transport.zip.
Словари для mSearch можно скачать по этой ссылке.
А вы не могли бы написать, как установить mSearch1 и словари для него вручную? Или дать ссылку на инструкцию?
1. Переходите в «Менеджер пакетов» (Пакеты -> Установщик). Нажимаете на кнопку «Загрузить пакеты», выбираете «Загрузить пакет с компьютера». Далее нажимаете на кнопку «Выберите файл(ы)» и указываете на архив с проектом. Кликаете на кнопку «Загрузить». После этого найдите пакет «msearch» в списке и нажмите на кнопку «Установить».
2. Извлеките словари в каталог \core\components\msearch\phpmorphy\dicts
&class=`ShopContent`?
Возможно ли это? Если нет, посоветуйте другой компонент.
Спасибо.
Как я понял поиск происходит по по пэкиджу 'modResource'.
Подскажите, нельзя ли добавить дополнительную таблицу для поиска (типа MIGXdb)?
Вопрос такой могу я скачать и установить mSearch2 вот от сюда https://github.com/SoftAlex/mSearch2. Если да то как.
Заранее спасибо!
После запуска этого скрипта он будет лежать в /core/packages.
А как сделать так чтоб в mSearch2, как у Вас в примере с mSearch врапер заработал, а то в верхний блок не отображается. Вот этот участок не работает
мой пример
чанк chankSearchTpl
чанк chankWrapperSearchTpl
Чанкт самой формы, стили не подтягиваются. Выдает стили по умолчанию mSearch2.
Заранее спасибо за помощь и за Ваш сайт!
у меня получился вот такой вызов, но все время показывает двойку
Пример содержимого чанка:
Если вы будете использовать @INLINE, то парсер MODX сначала разберёт все внутренние теги вызова mSearch2 (в данном случае плейсхолдеры). А уже только потом mSearch2. В итоге эти плейсхолдеры будут иметь значения, установленные не текущим вызовом mSearch2, а какие-то другие.
Слово, по которому осуществляется поиск, находится в новости в теге [[!+modx.user.id:gt=`0`:then=`….
И в результате поиска данная новость не попадает в список найденных. Такой вариант поиска вообще неосуществим или можно сделать какие-нибудь настройки?
Если всё же необходимо, то можете, конечно, создать дополнительное поле. С помощью этого поля указать набор слов, по которым должна искаться дополнительно каждая из статей.
После этого включить этого поле в mSearch:
Но и не забыть переиндексировать все ресурсы с включением этого поля.
Я как понимаю mSearch больше нет, т.к. сейчас есть платный mSearch2 и он для больших сайтов-магазинов.
А что посоветуете для небольших сайтов, бесплатное и где посмотреть доступную инструкцию по использованию?
Заранее благодарю.
Проект расположен на GitHub по адресу: github.com/bezumkin/mSearch
В этой статье приведены основные моменты по использованию mSearch. Если вам этой информации мало, то можете её ещё поискать в интернете на других ресурсах.
Какой из них использовать вам решать. Если вас всем устраивает mSearch, то используйте его. Если нет, то используйте mSearch2. mSearch2 не обязательно для больших сайтов, его можно использовать для любых проектов.
На GitHub остался старый форк mSearch2: github.com/SoftAlex/mSearch2
Вот вызов
Вот лог
Тогда попробуй:
1. Изменить значение &tplWrapper или переместить его в чанк:
2. Если не поможет, тогда надо смотреть чанк tpl.search. Что-то там не так…
Ещё можно удалить параметр &tpl=`tpl.search`. В этом случае он должен вывести данные (массивы) на экран.
2. tpl.search довольно прост)
Сам поиск то работает. 10 статей как положено выводятся. А вот пагинации самой почему-то нет. Хотя на странице, где выводятся статьи по хештегу, пагинация есть)
Удалял &tpl=`tpl.search`, массивы выводятся. Узрел в них вот это
Всем кодом, думаю, грузить тебя смысла нет?) Или подскажи как анализировать эти массивы)
У тебя найдено 6 записей. А ты их выводишь по 10.
Установи лимит, например 3 и проверь:
С лимитом 3, всё работает.
Тогда не пойму, как вообще работает поиск, в заголовке он ищет слово или по всему тексту) Почему записей всего 6, если
mse.total получается выдаёт 39.
Попробуй не использовать @INLINE и вынеси код в чанк:
В чанке mychank.tpl:
Я так пробовал) Тоже 39 выдаёт и 6 записей) С другими запросами так же, mse.total в разы больше, чем записей)
Я теперь не могу понять механизм поиска) Он же как яндекс по всему тексту ищет?)
Может поэтому и получается так, что искомое слово встречается больше раз, чем количество статей?) По несколько раз в каждой статье. И отсюда mse.total в разы больше.
Попробуй в pdoPage добавить параметр totalVar:
А в параметре tplWrapper вместо [[+mse.total]] использовать
[[+searchTotal]].
Можешь пояснить, почему при mse.total была такая цифра?
Попробуй на странице вызвать данный сниппет отдельно и посмотри что он выдаст:
Тогда уже можно будет судить о результатах.
1 это ресурс главной страницы в виде блога.
11, 12, 13 это разделы с тикетами.
Остальные сами тикеты, как раз 6 штук)
Вообще не понимаю как поиск работает) 6 ресурсов по поиску «похудеть» реально мало)
Попробуй поставить &parents=`0` и посмотри на результат. А дальше анализируй. Должно всё выводиться OK.
Куда копать?
На пятом шаге в пункте «Разработаем форму поиска» мы указывали id ресурса (14), который мы создали на 4 шаге.
На мой взгляд Вы скорее всего где-то перепутали на моментах, описанных мной выше. Проверьте совпадает ли у Вас идентификатор страницы «Поиск» с идентификатор в форме.
Красным подчёркнуто то, что необходимо добавить в код.
Это необходимо сделать для того, чтобы плейсхолдер можно было вызывать не так [[+total]] (т.к. данное имя уже занято другим компонентом), а так [[+mse.total]].
Т.е. необходимо заменить $totalVar на $plPrefix.$totalVar.
нет ошибки? Просто с этим кодом поиск вообще ничего не находит. Но если вместо него добавить [[!mSearch? &parents=`2`]], то всё работает должным образом
Данный код в отличие от Вашего позволяет настроить оформление результатов с помощью чанка searchTpl.
Найти ошибку можно следующим образом:
1. Удалить параметр &tplWrapper и проверить ещё раз.
2. Если у Вас находятся результаты, то необходимо проверить что у Вас содержит плейсхолдер +mse.total
3. Если у Вас всё равно не находятся результаты, то необходимо проверить наличие чанка searchTpl и что он содержит
Результаты поиска по запросу: легко (0)
Если вбить слово «способы», которое есть в названии раздела, то результат есть, но по разделу (выводит название раздела). Почему то, глубже разделов не ищет. У меня меню правда немного по другому организовано Ресурс (контейнер) и в нём уже Раздел с тикетами.
1. Если убрать &tplWrapper, то выводит и статьи и разделы.
2. Не пойму как проверить, что содержит плейсхолдер +mse.total.
3. Приведу оба кода на всякий случай, вроде, всё ровно.
tpl.search
Если нужно по всему сайту за исключением ресурсов 2, 3, 4 и 5, то тогда так:
И в параметре resources тоже самое…
Плейсхолдер mse.total содержит количество найденных записей.
Если необходимо вывести на экран что он выводит, то удали строчку:
Так вообще ничего не ищет, даже раздел.
Для проверки поставил так
Всё равно находит только результаты, если искомое слово входит в название раздела. Как будто глубина поиска ограничена. Такая же ситуация с картой сайта) Напишу комменту в соответствующую тему)
в параметры mSearch добавил и всё заработало)