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

Поиск по product_id


Angor

Recommended Posts

Использую в качестве артикула product_id из таблицы product.2 дня бьюсь не могу организовать поиск по этому полю, точнее, хотел чтобы $keyword в search.php искал не только по названию, но и по полю product_id. Есть идеи?Заранее благодарен.

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


Ну если принципиально забивать в $keyword еще и product_id, то массивом.

Почему бы не сделать по аналогии с category_id?

Тогда запрос выглядит как product/search&keyword=''&category_id=0&product_id=1234

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

Эммм... а смысл тогда вводить название, если знать id?Не совсем понятно "если не нашел по названию, то нашел по product_id".По id то понятно что найдет)Я думал вы имеете ввиду, чтобы человек не парился с приблизительным поиском, то введя id он гарантированно попадет на нужный ему товар!?

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

"Не совсем понятно "если не нашел по названию, то нашел по product_id"."так введя id - не найдет, по умолчанию keyword ищет только в поле name табл. product_description"то введя id он гарантированно попадет на нужный ему товар!?" как можно реализовать? оч. надо...например поставить ещё один checkbox для поиска по id

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


Ну правильно. Делаешь чекбокс в шаблоне

<legend><input type="checkbox" name="on_id" value="" />По id (артикулу)</legend>
в модели catalogmodelcatalogproduct.php, в методе public function getProductsByKeyword добавь после аргумента $description = FALSE, вот это $on_id = FALSE,

В этом же методе, замени конструкцию

if (!$description) { $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%'";} else { $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%')";}
на эту

if ($description) { $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%')";} elseif ($on_id) { $sql .= " AND pd.product_id = '" . $this->db->escape($keyword) . "'";} else { $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%'";}
после этого осталось изменить путем копипаста контроллер сatalog/controller/product/search.php

по аналогии с description

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

Ну разумеется не передается, вы наверное не заметили внизу шаблона скрипт отправки get в контроллер?

if ($('#on_id').attr('checked')) {		url += '&on_id=1';	}

Это добавить после

if ($('#description').attr('checked')) {		url += '&description=1';	}
И не забудьте присвоить чекбоксу id="on_id".

На счет "не все находит", есть два способа:

Возможно нужно принудительно указать тип переменной для $sql .= " AND pd.product_id = '" . $this->db->escape($keyword) . "'";

т.е. выйдет

$sql .= " AND pd.product_id = '" . (int)$keyword . "'";

Хоть я не уверен в правильности такого решения.

Второй способ глупый, но быстрый. Сымитируйте синтаксическую ошибку запроса SQL (напр указанием product_i вместо product_id) и посмотрите в дебаге что хочет вставить модель в запрос, когда дело касается поиска по id.

Возможно, что кроме числа передается пробел или что-то левое.

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

Очень странно:

пробуем с $keyword=82, заранее рабочий вариант,

имитируем product_i вместо product_id получаем

Error: Unknown column 'pd.product_i' in 'where clause'Error No: 1054SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE pd.language_id = '1' AND p2s.store_id = '0' AND ss.language_id = '1' AND pd.product_i = '82'  AND p.status = '1' AND p.date_available <= NOW() GROUP BY p.product_id ORDER BY p.sort_order ASC LIMIT 0,12
Тоесть pd.pdoduct_i передается в нормальном виде -
AND pd.product_i = '82'
Если пробуем, например, с $keyword=279, заранее нерабочий вариант (в базе есть 100%), получаем

route=product/search&keyword=279&category_id=0&onid=1 и Нет товаров, которые соответствуют критериям поиска.

Никакого дебага. В контроллер не попадает?

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


Не знаю, зачем я тупил, решилось всё следующим образом

if ($('#on_id').attr('checked')) {url = 'index.php?route=product/product&category_id=0&product_id='+keyword;}
Если позиции нет то и напишет "товар не найден" ;)

Спасибо за помощь.

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


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

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

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

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

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

Вхід

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

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

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

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

Important Information

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