[СДЕЛАЙ САМ] Поиск по МАЛЕНЬКОМУ сайту за 5 минут.

Я уже писал один вариант тут и он мне казался быстрым, но тут я понял, когда лень одолела окончательно, что можно ещё быстрее. Далее буду излагать информацию предназначенную для новичков, корифеи Modx ничего нового для себя не откроют.

Берем страницу каталога или категории, что суть одно и то же и пишем там примерно такой вызов
{if $.get.sq}
    {set $query = $.get.sq | replace: '_' : '%' | notags | stripmodxtags}
    {set $where = ['template' => 3, 'pagetitle:LIKE' => '%'~$query~'%', 'OR:longtitle:LIKE' => '%'~$query~'%', 'OR:menutitle:LIKE' => '%'~$query~'%', 'OR:description:LIKE' => '%'~$query~'%' , 'OR:introtext:LIKE' => '%'~$query~'%']}
{else}
    {set $where = ['template' => 3]}
{/if}
{set $products = '!pdoPage@custom' | snippet: [
    'parents' => $rid,
    'element' => 'msProducts',
    'sortby' => ['menuindex' => 'ASC'],
    'includeThumbs' => 'big',
    'where' => $where,
    'tpl' => '@FILE chunks/shop/product_preview.html',
    'limit' => 12,
]}
Обратите внимание на преобразование данных полученных из get-параметров. На выходе получим примерно такую строку «Несколько%слов».

Форма поиска нам не нужна, вместо неё будет такая конструкция
<div class="form">
          <input type="text" placeholder="Найти товар" id="jsSearchInput">
          <a href="{10 | url}" id="jsSearchLink"><i class="far fa-search"></i></a>
    </div>
{10 | url} — ссылка на страницу любой категории товаров.
И надо добавить к этой ссылке запрос пользователя, для этого будем использовать JavaScript
let searchInput = document.getElementById('jsSearchInput'),
        searchLink = document.getElementById('jsSearchLink'),
        defaultSearchLink = searchLink.href;
    if(searchInput){
        searchInput.addEventListener('input', function(e){
            let query = e.target.value.replace(' ', '_'),
                newLink = defaultSearchLink +'?sq='+ query;
                if(!query){
                    newLink = defaultSearchLink;
                }
                searchLink.href = newLink;
        });
    }
Собственно это всё.
Поиск максимально простой, но можно выбирать по каким полям искать, в каких шаблонах, так же можно добавить синонимы например в поле introtext.
Например, есть на сайте товар Apple Watch Series 6, чтобы покрыть запросы пользователей незнающих аглицкий, можно в introtext или любое другое поле написать "'эппл воч 6" и тогда поиск найдёт часы, если в запросе будет одно из слов «эппл» или «воч 6».
Производительность данного решения не проверял, у меня сайт небольшой, проблем нет.
Артур Шевченко
24 октября 2021, 23:09
modx.pro
1
938
+3
Поблагодарить автора Отправить деньги

Комментарии: 4

Евгений Шеронов
25 октября 2021, 00:53
+2
один вариант тут и он мне казался быстрым, но тут я понял, когда лень одолела окончательно, что можно ещё быстрее
Что имеется ввиду под быстротой?)

Здесь я вижу самый медленный возможный поиск.
Он не использует индексов в БД вообще (так как с двух сторон навешаны %).

Опять таки query параметр никак не экранируется (привет SQL инъекция!).
Возможно pdoTools и обработает как-то where, но рассчитывать, а тем более привыкать так делать не нужно.

Сайт небольшой — это до 100 страниц?

Помимо этого, условие некорректно выполняется. Шаблон не будет учтён при совпадениях вне pagetitle)
    Артур Шевченко
    25 октября 2021, 07:26
    0
    Под быстротой я имею ввиду скорость создания поиска.
    А сайт действительно до 100 страниц, если есть рекомендации по улучшению запроса, а именно как его переписать так, чтобы учитывался шаблон и чтобы он работал быстрее, буду признателен.
    И да, я надеюсь query обрабатывается в pdoTools.
      Сергей Шлоков
      25 октября 2021, 13:26
      +1
      Возможно pdoTools и обработает как-то where, но рассчитывать, а тем более привыкать так делать не нужно.
      pdoTools ничего не обрабатывает. Он передает всё в xPDO. А тот уже строит подготовленный запрос.
        Артур Шевченко
        25 октября 2021, 14:05
        0
        Я не призываю к этому привыкать, этот вариант годится только для очень небольших сайтов, например, как в моём случае для маленького имага чисто протестировать нишу. Если проект зайдёт, тогда будут подключаться дополнения.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4