Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

Поиск по product_id


Recommended Posts

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites

Спасибо, так тоже можно, но хотелось бы чтобы $keyword искал по 2 полям, если не нашел по названию, то нашел по product_id.Как бы это реализовать?

Link to post
Share on other sites

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

<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

Link to post
Share on other sites

Хм..route=product/search&keyword=279&category_id=0не находит ничего, всё перепроверил, вроде ничего не пропустил

Link to post
Share on other sites

Короче, чекбокс в строку не передаётся, если руками on_id=1 то всё работает....

Link to post
Share on other sites

Даже так половину находит, половину нет, нарпимер такой id точно есть.route=product/search&keyword=279&category_id=0&on_id=1результат - ничего

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

пробуем с $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 и Нет товаров, которые соответствуют критериям поиска.

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

Link to post
Share on other sites

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

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

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

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.