[Решено] Поиск по описанию

Тема в разделе "OpenCart", создана пользователем malegender, 6 авг 2013.

Статус темы:
Закрыта.
  1. malegender

    malegender

    Регистрация:
    16 июл 2013
    Сообщения:
    18
    Симпатии:
    3
    Доброго времени суток.
    Улучшил немного поиск, а именно по умолчанию стоят галочки искать в описании и подкатегории.
    Поиск по названию товара работает отлично. Например название "Деталь CK-601" если в поиске набрать:
    "деталь" или "CK" или "601" этот товар попадет в список найденного.
    Но если у товара "Деталь CK-601" в описании значится "Совместим с моделью К850", то при вводе в поисковую строку "850" ничего не находит. Находит только если ввести "К850".
    Как можно это исправить?
     
  2. kur1977

    kur1977

    Регистрация:
    11 фев 2013
    Сообщения:
    123
    Симпатии:
    59
    Версия движка?
     
  3. malegender

    malegender

    Регистрация:
    16 июл 2013
    Сообщения:
    18
    Симпатии:
    3
    OpenCart 1.5.4
     
  4. kur1977

    kur1977

    Регистрация:
    11 фев 2013
    Сообщения:
    123
    Симпатии:
    59
    catalog\model\catalog\product.php

    строку
    PHP:
    $sql .= "LCASE(pd.name) LIKE '%" $this->db->escape(utf8_strtolower($data['filter_name'])) . "%' OR MATCH(pd.description) AGAINST('" $this->db->escape(utf8_strtolower($data['filter_name'])) . "')";
    (она в файле встречается два раза. Заменить оба.)

    Заменить на

    PHP:
    $sql .= "LCASE(pd.name) LIKE '%" $this->db->escape(utf8_strtolower($data['filter_name'])) . "%' OR LCASE(pd.description) LIKE '%" $this->db->escape(utf8_strtolower($word)) . "%'";
     
  5. malegender

    malegender

    Регистрация:
    16 июл 2013
    Сообщения:
    18
    Симпатии:
    3
    теперь при поиске "850" ищет все товары с любым упоминанием и 8 и 5 и 0 (((
     
  6. kur1977

    kur1977

    Регистрация:
    11 фев 2013
    Сообщения:
    123
    Симпатии:
    59
    Опечатка вышла. Правильно
    PHP:
    $sql .= "LCASE(pd.name) LIKE '%" $this->db->escape(utf8_strtolower($data['filter_name'])) . "%' OR LCASE(pd.description) LIKE '%" $this->db->escape(utf8_strtolower($filter_name)) . "%'";
    А лучше вообще замени
    PHP:
    if (!empty($data['filter_name'])) {
    if (!empty(
    $data['filter_description'])) {
    $sql .= "LCASE(pd.name) LIKE '%" $this->db->escape(utf8_strtolower($data['filter_name'])) . "%' OR MATCH(pd.description) AGAINST('" $this->db->escape(utf8_strtolower($data['filter_name'])) . "')";
    } else {
    $sql .= "LCASE(pd.name) LIKE '%" $this->db->escape(utf8_strtolower($data['filter_name'])) . "%'";
    }
    }
    на

    PHP:
    if (!empty($data['filter_name'])) {
    $implode = array();
     
    $words explode(' 'trim(preg_replace('/\s\s+/'' '$data['filter_name'])));
     
    foreach (
    $words as $word) {
    if (!empty(
    $data['filter_description'])) {
    $implode[] = "LCASE(pd.name) LIKE '%" $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" $this->db->escape(utf8_strtolower($word)) . "%'";
    } else {
    $implode[] = "LCASE(pd.name) LIKE '%" $this->db->escape(utf8_strtolower($word)) . "%'";
    }
    }
     
    if (
    $implode) {
    $sql .= " " implode(" OR "$implode) . "";
    }
    }
    в этом файле в 2х местах. Тогда поисковая фраза будет разбиваться на слова и поиск будет по каждому слову а не по всей фразе.
     
    malegender нравится это.
Статус темы:
Закрыта.