Поиск по полю и переход к товару mSearch2

День добрый. Нашел в одном магазине интересное решение — поиск по коду товара, вводишь код и по нажатию «найти» попадаешь сразу на страницу товара с этим кодом.
Сходу решить не получилось, прошу помочь советом как это можно реализовать с mSearch2?
Михаил
06 августа 2018, 15:19
modx.pro
1 953
0

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

Stanislavsky
06 августа 2018, 16:55
0
Код = Артикул.Нужно в системных настройках mSearch2, в поле «Индексация полей», указать ваше поле, а затем проиндексировать. Должен заработать.
    Михаил
    06 августа 2018, 17:06
    0
    Это понятно, вопрос в переходе стазу на товар без страницы «результаты поиска».
      Stanislavsky
      06 августа 2018, 17:11
      0
      Так там сработает autocomplete, после чего выберите товар. Если прямой переход, то скорей всего придется сниппетом своим обработать.
        Михаил
        06 августа 2018, 17:50
        0
        Вот сниппет и не получается, нужно ж по нажатию «Найти» перейти на товар, при условии, что он есть
    Артур
    06 августа 2018, 22:14
    0
    Вы это решение на MODX видели?
    на WP WooCommerce есть такое.
    На mSearch2 уже допиливать надо будет.
      Руслан Сафин
      06 августа 2018, 23:29
      0
      Зачем через mSearch2?

      Примерно так, проверки сами добавите какие надо. На работоспособность не проверял

      $res = $modx->->getObject('msProduct', array('article' => $_GET['search']));
      $product_id = $res->get('id');
      
      if($product_id) {
          $modx->sendRedirect($modx->makeUrl($product_id));
      }
        Руслан Сафин
        06 августа 2018, 23:32
        0
        Если с mSearch2 надо, думаю плагин повесить можно на событие, что бы отловить нужный код товара и сделать редирект на него если он есть (в теории с mSearch2 плотно не работал)
        Василий Наумкин
        07 августа 2018, 00:43
        +1
        Никого не смущает, что на демо-сайте так и работает, из коробки?
        minishop2.com/search/simple — набрать «товар» и кликнуть по результату.

        Если же речь про нахождение единственного результата и редирект на него — то только своим сниппетом, который сам найдёт и отредиректит. Именно так работает поиск на modstore.pro
          Михаил
          07 августа 2018, 09:48
          0
          Василий, день добрый. Да именно так, как на modstore.pro.
            Михаил
            07 августа 2018, 10:27
            0
            Рабочий сниппет можно увидеть? Попробую понять и применить.
              Руслан Сафин
              07 августа 2018, 11:27
              0
              Я же написал кусок кода, по гет параметру ищем объект, если находит то получаем его ИД и редиректим на него. Сделай либо плагином, либо снипеттом с вызовом до mSearch
                Михаил
                07 августа 2018, 12:44
                0
                Понял, поробую
                  Михаил
                  07 августа 2018, 17:06
                  0
                  $res = $modx->getObject('msProduct', array('article' => $_GET['search']));
                  [2018-08-07 17:05:32] (ERROR @ /home/s9074/www/core/xpdo/om/xpdoobject.class.php: 240) Error 42S22 executing statement:
                  Array
                  (
                  [0] => 42S22
                  [1] => 1054
                  [2] => Unknown column 'msProduct.article' in 'where clause'
                  )
                  не могу понять в чем дело…
                    Денис
                    07 августа 2018, 17:31
                    0
                    Замените msProduct на msProductData
                      Руслан Сафин
                      07 августа 2018, 20:39
                      0
                      Да ошибся я, вот код, проверил работает:

                      $res = $modx->getObject('msProductData', array('article' => $_GET['search']));
                      $product_id = $res->get('id');
                      if($product_id) {
                          $modx->sendRedirect($modx->makeUrl($product_id));
                      }
                        Михаил
                        08 августа 2018, 10:12
                        0
                        Спасибо за помощь )
                        Вчера еще полдня провозился, теперь сервер выдает 500…
                        На сервере в логах:
                        2018/08/08 09:42:32 [error] 3191#3191: *56026 FastCGI sent in stderr: «PHP message: PHP Fatal error: Uncaught Error: Call to a member function get() on null in /home/*****/www/core/cache/includes/elements/modsnippet/48.include.cache.php:3
                        Stack trace:
                        #0 /home/*****/www/core/model/modx/modscript.class.php(70): include()
                        #1 /home/*****/www/core/model/modx/modparser.class.php(536): modScript->process(NULL)
                        #2 /home/*****/www/core/components/pdotools/model/pdotools/pdoparser.class.php(273): modParser->processTag(Array, false)
                        #3 /home/*****/www/core/model/modx/modparser.class.php(250): pdoParser->processTag(Array, false)
                        #4 /home/*****/www/core/components/pdotools/model/pdotools/pdoparser.class.php(65): modParser->processElementTags('[[$Header]]', '<section class=...', false, false, '[[', ']]', Array, 9)
                        #5 /home/*****/www/core/model/modx/modchunk.class.php(117): pdoParser->processElementTags('[[$Header]]', '<section class=...', false, false, '[[', ']]', Array, 10)
                        #6 /home/*****/www/core/model/modx/modparser.class.php(498): modChunk->process(NULL)
                        #7 /home/*****/www/core/comp» while reading response header from upstream, client: 194.***.11.106, server: *****.h3.modhost.pro, request: «GET /katalog/kolczo-iz-belogo-zolota,-358380/ HTTP/1.1», upstream: «fastcgi://127.0.0.1:1****», host: "*****.h3.modhost.pro"

                        Причем такое выдает на любые поля из msProductData. Гуглю на тему получения $_GET['search'] пока не понятно.
                          Михаил
                          08 августа 2018, 13:19
                          0
                          Пока отключил $_GET['search'] поставил туда постоянное значение.
                          Но появилась проблема с sendRedirect — ERR_TOO_MANY_REDIRECTS.
                          Она есть в твоем варианте:
                          if($product_id) {
                          $modx->sendRedirect($modx->makeUrl($product_id));
                          }
                          и в моем:
                          if($product_id) {
                          $url = $modx->makeUrl($product_id);
                          $modx->sendRedirect($url);
                          }
                          если поставить $modx->sendRedirect('http://yandex.ru'); — редирект без проблем!
                          что у меня может вызывать многократный редирект?
                      Василий Наумкин
                      08 августа 2018, 15:44
                      3
                      +2
                      А рожу вареньем не намазать?

                      Ладно, держи:
                      if (!empty($_REQUEST['query'])) {
                          $query = htmlspecialchars(strip_tags(trim($_REQUEST['query'])));
                          $resource = $modx->getObject('msProduct', [
                              'pagetitle' => $query,
                              'class_key' => 'msProduct',
                              'deleted' => 0,
                              'published' => 1,
                              'context_key' => $modx->context->key,
                          ]);
                          if ($resource) {
                              $modx->sendRedirect($resource->get('uri'));
                          }
                      }
                        Михаил
                        08 августа 2018, 16:23
                        0
                        Спасибо, Василий.
                        по pagetitle работает правильно (показывает все результаты, потому что уникальных нет).
                        А мне надо по полю shifr (аналог article). Правильно ли я поменял в коде?
                        if (!empty($_REQUEST['query'])) {
                            $query = htmlspecialchars(strip_tags(trim($_REQUEST['query'])));
                            $resource = $modx->getObject('msProductData', [
                                'shifr' => $query,
                                'class_key' => 'msProduct',
                                'deleted' => 0,
                                'published' => 1,
                                'context_key' => $modx->context->key,
                            ]);
                            if ($resource) {
                                $modx->sendRedirect($resource->get('uri'));
                            }
                        }
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    19