Вход • Регистрация

Вывод товаров в шаблонном теге

  • 03 июня 2017 г. , редакция: 03 июня 2017 г.
  • Добрый день!
    Пытаюсь прикрутить поиск через Sphinx и запнулся на подготовке найденных карточек товара к отображению.
    Т.е. у меня есть шаблонный тег для вывода результатов поиска, где я формирую список ID найденных товаров $productsId.
    Затем получаю базовый список товара вот таким запросом:
    Код
    $result ['rows'] = DB::query_fetch_all("SELECT DISTINCT id, [name], timeedit, [anons], site_id, brand_id, no_buy, article, hit, new, action, is_file, [measure_unit] FROM {shop} WHERE [act]='1' AND trash='0' AND id IN (".implode(",", $productsId).")");

    Дальше пытаюсь получить расширенные данные для товара, но не выходит:
    Код
    $this->diafan->_shop->elements(&$result ['rows']);


    Конечная цель у меня - подготовить данные для вывода найденного товара через вьюху "shop.view.rows".

    Собственно, вопросы:
    1) Как подготовить данные, достаточные для вывода через вьюху "shop.view.rows" в обычном шаблонном теге?
    2) Получится ли потом вывести подготовленные данные вот так:
    Код
    echo $this->diafan->_shop->get('rows', 'shop', $result);


    ТП пока молчит, может из коллег кто подскажет?
  • 04 июня 2017 г.
  • Спасибо, натолкнули на мысль попробовать использовать не общий шаблонный тег, а шаблонный тег для модуля Shop.
    Сейчас попробую реализовать.
  • 04 июня 2017 г.
  • Получилось все-таки прикрутить поиск на Sphinx. Если кому интересно, пишите - опубликую общий алгоритм действий.
    • 05 июня 2017 г.
    • Здравствуйте, если не сложно выложите решение сюда. Спасибо.
  • 07 июня 2017 г.
  • Хорошо, сегодня выложу.
    ЗЫ Что-то уведомления о новых сообщениях в ветке не приходят, хорошо что в личку написали.
  • 07 июня 2017 г. , редакция: 07 июня 2017 г.
  • В общем порядок действий был такой:
    1) Настраиваем Sphinx самым простым способом, вот мой конфиг:
    Код

    source anyname_src
    {
    type = mysql

    sql_host = localhost
    sql_user = <пользователь БД>
    sql_pass = <пароль к БД>
    sql_db = <БД>
    sql_port = 3306

    sql_query_pre = SET NAMES utf8
    sql_query = SELECT id, name1, article, anons1 FROM <ваша таблица ..._shop> WHERE act1 = '1'
    }

    index anyname
    {
    source = anyname_src
    path = /var/data/sphinx/anyname
    morphology = stem_ru
    min_word_len = 3
    html_strip = 1
    min_infix_len = 3
    expand_keywords = 1
    }

    indexer
    {
    mem_limit = 128M
    }

    searchd
    {
    listen = 127.0.0.1:9306:mysql41 #чтобы только локально можно было достучаться и только через соединение MySQL, т.е. просто через консоль работать не будет
    log = /var/log/sphinx/searchd.log
    query_log = /var/log/sphinx/query.log
    read_timeout = 5
    max_children = 30
    pid_file = /var/run/sphinx/searchd.pid
    seamless_rotate = 1
    preopen_indexes = 1
    unlink_old = 1
    workers = threads # for RT to work
    binlog_path = /var/lib/sphinx/
    }


    2) В шаблонах страниц вставляем тег <insert name="show_search">, если его еще нет. После чего правим themes\functions\show_search.php, чтобы форма для поиска смотрела на страницу /search-results

    3) Создаем через админку страницу "Результаты поиска" с URL /search-results и в ее содержимое вставляем только шаблонный тег <insert name="show_sphinx_search_result" module="shop">

    4) Дальше создаем шаблонный тег modules\shop\views\shop.view.show_sphinx_search_result.php, куда копируем содержимое файла modules\shop\views\shop.view.list.php и убираем лишнее (я убрал все, кроме вывода списка товара, добавил вывод сообщений если ничего не найдено или не указана фраза для поиска)

    5) Добавляем в modules\shop\shop.model.php функцию для шаблонного тега:
    Код

    /**
    * Генерирует результат поиска товаров через Sphinx
    *
    * @param sting $searchword поисковая фраза
    * @return array
    */
    public function show_sphinx_result($searchword)
    {
    $pdo = new PDO('mysql:host=127.0.0.1;port=9306');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->query("SELECT * FROM <название индекса из настроек Sphinx> WHERE MATCH('$searchword')");
    $search_results = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $productsId = array();
    foreach ($search_results as $value) {
    $productsId[] = $value['id'];
    }

    $this->result["rows"] = DB::query_fetch_all("SELECT DISTINCT id, [name], timeedit, [anons], site_id, brand_id, no_buy, article,"
    ."hit, new, action, is_file, [measure_unit] FROM {shop} "
    ." WHERE [act]='1' AND trash='0' AND id IN (".implode(",", $productsId).")");

    $this->elements($this->result["rows"]);

    foreach ($this->result["rows"] as &$row)
    {
    $this->format_data_element($row);
    }

    return $this->result;
    }
    }


    6) Добавляем шаблонную функцию в modules\shop\shop.php
    Код

    /**
    * Шаблонная функция: выводит результаты поиска через Sphinx
    * @return void
    */
    public function show_sphinx_search_result()
    {
    if(!empty($_GET['searchword'])){
    $searchword = strip_tags($_GET['searchword']);
    $searchword = htmlspecialchars($searchword);
    $result = $this->model->show_sphinx_result($searchword);
    $result['searchword'] = $searchword;
    echo $this->diafan->_tpl->get('show_sphinx_search_result', 'shop', $result);
    }
    else{
    $result = array();
    $result['error'] = 'Ошибка: не задано слово для поиска.';
    echo $this->diafan->_tpl->get('show_sphinx_search_result', 'shop', $result);
    }
    }
    • 07 июня 2017 г. , редакция: 07 июня 2017 г.
    • Можете еще тут опубликовать https://www.diafan.ru/solutions/ чтобы вообще в анналы решений :)

      Вы кстати делая интеграцию со сфинском какие технические цели преследовали на проекте какого масштаба поделитесь пожалуйста.
      • 07 июня 2017 г.
      • Добавил - ушла на модерацию.
        Цель интеграции проста - релевантный поиск по товарам.
        Адекватный поиск из коробки я и не ожидал - во всех движках такая же проблема, особенно когда нужно искать по хитрым артикулам с разными символами вперемешку с названием и другие подобные извраты.
        Ну и плюс скорость работы - Sphinx в этом плане гуд.
        Проект - перенос магазина hobbery.ru с PrestaShop на Диафан, уже второй месяц колдую, но скоро уже перейду.
        Масштаб - после чистки осталось порядка 14 тыс. товаров.

Новости

  • Вчера, 09:05
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 
  • 15 декабря 2023 г.
  • Подводим итоги 2023 года. Выпустили новую сборку DIAFAN.CMS 7.1.1, вводим новые тарифы на аренду сайта и коммерческую поддержку и автообновления с января 2024 г., строим планы на будущий год.