Jump to content
покупайте без комиссии
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


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

Link to post
Share on other sites

  • 2 months later...

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

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

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

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.