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