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

Поиск по product_id

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

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

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


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

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

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

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

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


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

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

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


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

Эммм... а смысл тогда вводить название, если знать 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

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


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

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

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


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

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

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


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

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

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


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

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

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

×

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

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