База знаний
Поиск по категориям базы знаний
Все .htaccess 1C Bytehand CommerceML IIS nginx show_block SMS Sphinx Артикул Доступность Кастомизация Кастомизация админки Корзина Купить в один клик Магазин Меню Модуль МойСклад Мультиязычность Наличие товара Объявления Пагинация Пароль Перенос сайта Поиск Поиск по объявлениям Пользователи Права на файлы Сжатие CSS-файлов Скидка Создание товара Сортировка Статьи Счетчик Тема Установка Файловый архив Фильтр Шаблон Шаблон письма Шаблонный тегПроблема
Поиск по сайту через Sphinx
Решение
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) В шаблонах страниц вставляем тег 
3) Создаем через админку страницу "Результаты поиска" с URL /search-results и в ее содержимое вставляем только шаблонный тег 
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);
    }
}
