Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


ychetka

Recommended Posts

Эххх.. Собственно, возникла необходимость в поиске по атрибутам товара. Не мудрствуя лукаво, было принято решение допилить встроенный расширенный поиск (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 знаком сегодня ровно как неделю, прошу сильно не пинать, мог где-то что-то упустить.

Надіслати
Поділитися на інших сайтах


  • 2 months later...

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

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

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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.