ychetka

Прошу помощи (поиск по атрибутам товара)

Рекомендуемые сообщения

ychetka    0

Эххх.. Собственно, возникла необходимость в поиске по атрибутам товара. Не мудрствуя лукаво, было принято решение допилить встроенный расширенный поиск (oStore). Забегая вперед, скажу что шаблон вывода товара и контроллер (а точнее проверка в контроллере), были отредактированы, таким образом, никаких

<select><option></option></select>  

в шаблоне вывода нет, а строится таблица , т.е. в моем варианте (точнее заказчика) ему нужен был именно такой функционал

картинка

Итак вернусь к поиску.

Решил использовать встроенную возможность искать модель (пока так, потом отредактирую темплейты нормально).

Запрос для поиска (пример) - .../index.php?route=product/search&keyword=красный&category_id=0&model=1

Контроллер поиска использует модель

/catalog/product

функции

getTotalProductsByKeyword

getTotalProductsByTag

(я так понял это два параллельных поиска так далее их результаты просто сравниваются и берется результат того у кого больше)

$product_total = $this->model_catalog_product->getTotalProductsByKeyword($this->request->get['keyword'], isset($this->request->get['category_id']) ? $this->request->get['category_id'] : '', isset($this->request->get['description']) ? $this->request->get['description'] : '', isset($this->request->get['model']) ? $this->request->get['model'] : '');


$product_tag_total = $this->model_catalog_product->getTotalProductsByTag($this->request->get['keyword'], isset($this->request->get['category_id']) ? $this->request->get['category_id'] : '');


$product_total = max($product_total, $product_tag_total);

По сути обе - это выборка из БД, правда запросы там не простые, а с объединением таблиц, чем и было решено воспользоваться:

Вот отредактированная строка из модели /model/catalog/product.php функция getTotalProductsByKeyword :

$sql = "SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description 
pd ON (p.product_id = pd.product_id)  LEFT JOIN " . DB_PREFIX . "product_option_value_description povd ON 
(p.product_id = povd.product_id)  LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) 
WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . 
(int)$this->config->get('config_store_id') . "'";

Я присоединил

product_option_value_description

к запросу и провел соотношение

product.product_id = product_option_value_description.product_id

и еще одно небольшое условие ниже

if (!$model) {
$sql .= ")";

} else {
$sql .= " OR povd.name LIKE '%" . $this->db->escape($keyword) . "%')";
}

По аналогии с были отредактированы выборки:

getTotalProductsByKeyword
getTotalProductsByTag 
getProductsByKeyword 
getProductsByTag

Задача поиска по атрибутам в итоге решена, но отрабатывает некорректно, а точнее:

Если в поиск забить к примеру слово "красный" и у какого нибудь товара есть опция значение которой "красный" поиск работает нормально, но если слово поиска будет "красный карандаш" - поиск не выдаст результатов, я не понимаю отчего это происходит, ведь выборка идет LIKE %% (

$sql .= " OR povd.name LIKE '%" . $this->db->escape($keyword) . "%')";

)

причем даже пробле вначале слова " красный" - поиск не дает результатов. Сейчас на яве сделал ключевому слову trim (убираю пробелы с начала и конца строки), но это заплатка.

Собственно свою проблемую я думаю я описал детально, если будут у кого-то вопросы по описанию, пишите я дам более детальные пояснения. Помогите решить проблему с поиском.

P/S Я с Opencart знаком сегодня ровно как неделю, прошу сильно не пинать, мог где-то что-то упустить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
simulacrum    0

у вас в поле "product_option_value_description" содержится слово "красный", но не "красный карандаш".

Надо создавать второе условие для поиска, чтобы искало в полях "p.name" и в "povd.name" одновременно

Чтобы поиск был по полям "название товара" (в нашем случае - карандаш) и по "атрибутам" (опиям) - в нашем случае это цвет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу