Перейти к содержанию
ychetka

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

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

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

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


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

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

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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.