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

Фильтр по аттрибутам [Разработка]


Recommended Posts

Здравствуйте,Я php программист и помогите пожалуйста подкиньте идею реализации и т.п
Я хотел сделать фильтр  товаров по аттрибутам (стандартным).

Я сделал вывод аттрибутутов и их значения.

Столкнулся с проблемой с фильтрацией.
Есть таблица там вот такие значения oc_product_attribute (во вложении есть картинка).

Я могу сделать фильтрацию товаров по одному аттрибуту, например
WHERE oc_product_attribute.text = "2 года"
Как сделать,чтобы был вывод товаров по 2 или более аттрибутам.?
Если писать WHERE oc_product_attribute.text = "2 года" AND oc_product_attribute.text = "2 аттрибут" //не будет работать т.к там отдельная запись под каждый аттрибут
А мне надо узнать product_id
Есть идеи реализации?

image.png

image.png

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


А по ID не вариант фильтровать ))) ? Передаете выбранные атрибуты через IN

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

Я вот к примеру модифицировал стандартный фильтр ОС, ничем не хуже фильтрации по атрибутам, даже лучше и удобнее.

 

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

5 минут назад, legioner26 сказал:

А по ID не вариант фильтровать ))) ? Передаете выбранные атрибуты через IN

В том то и дело, что мне надо фильтровать по аттрибутам Чтобы узнать id товаров которые нужно мне вывести...
SELECT * FROM oc_product_attribute tt WHERE tt.text IN ('2 года', '16МП')
Эта запись аналогична Or а мне надо чисто через AND
Есть идеи? Если переделать стандартный фильтр, то как лучше? 
Кстате, стандартный модуль Фильтр чет не робит у меня

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


Посмотрите модель getProducts, как она устроена и сделайте на основе свое.

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

2 минуты назад, legioner26 сказал:

Посмотрите модель getProducts, как она устроена и сделайте на основе свое.

Я так и делаю)
Только там нет фильтра по аттрибутам я там пилю и вот столкнулся проблемой, которую описал выше

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


Вот вам выборка к примеру по ID. Там в дальнейшем цепляете еще ID категории, описание, имя, цены продукта и  т.д.

http://prntscr.com/jbxe6n

SELECT * FROM `oc_product_attribute` pa LEFT JOIN `oc_product` p ON (pa.product_id=p.product_id) WHERE pa.attribute_id IN (121,119,124)

 

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

Я отказался пока внедрять в стандартный модиф фильтрацию по аттр. :) 

Так как атрибуты изначально не предназначены для фильтра.

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

5 минут назад, legioner26 сказал:

Вот вам выборка к примеру по ID. Там в дальнейшем цепляете еще ID категории и т.д.

http://prntscr.com/jbxe6n


SELECT * FROM `oc_product_attribute` pa LEFT JOIN `oc_product` p ON (pa.product_id=p.product_id) WHERE pa.attribute_id IN (121,119,124)

Можно

Можно ли с вами связаться? Вы не поняли, мне надо строго сделать фильтрацию товаров по аттрибутам, в вашем случае вы вывели товары где присутствуют id аттрибутов, но у них то разные значения)

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


3 минуты назад, legioner26 сказал:

Я отказался пока внедрять в стандартный модиф фильтрацию по аттр. :) 

Так как атрибуты изначально не предназначены для фильтра.

)))
Просто хочу сделать фильтрацию как в dns или мвидео

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


1 минуту назад, YanGus сказал:

Можно ли с вами связаться? Вы не поняли, мне надо строго сделать фильтрацию товаров по аттрибутам, в вашем случае вы вывели товары где присутствуют id аттрибутов, но у них то разные значения)

Ппц смотрите :) 

Вы к примеру через аякс там или просто, передаете включенные чекбоксы через GET к примеру в которых в value содержатся ID атрибутов. 

Или Вам нужно просто пока что вывести все значения в категории ?

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

2 минуты назад, legioner26 сказал:

Ппц смотрите :) 

Вы к примеру через аякс там или просто, передаете включенные чекбоксы через GET к примеру в которых в value содержатся ID атрибутов. 

Или Вам нужно просто пока что вывести все значения в категории ?

Ну я сначало хотел определиться с sql запросами потом уже реализовать это.
А так можно сделать как на ajax так и на get.
Думал передавать значение text (2 года)
Вывод я уже сам сделал

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


Вот к примеру  запрос на вывод наличия товаров к конкретной категории. 

SELECT DISTINCT s.name, s.stock_status_id FROM " . DB_PREFIX . "stock_status s LEFT JOIN " . DB_PREFIX . "product p ON (s.stock_status_id=p.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category ptc ON (p.product_id=ptc.product_id) WHERE ptc.category_id = '" . (int)$category_id. "' AND s.language_id='" . (int)$this->config->get('config_language_id') . "'

Сделайте свой по атрибутам с привязкой к категории.

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

К примеру

attribute = [];
$('input[name^=\'attribute\']:checked').each(function(element) {
        attribute.push(this.value);
    });
    attribute =attribute.join(',');

И передаете все ID в запрос

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

19 минут назад, legioner26 сказал:

К примеру


attribute = [];
$('input[name^=\'attribute\']:checked').each(function(element) {
        attribute.push(this.value);
    });
    attribute =attribute.join(',');

И передаете все ID в запрос

Да я это знаю, спасибо, я вот думаю долго как над бд поработать, делать велосипед? кхм.... 

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


Я бы не стал заморачиваться :) Или же если для своих проектов только :) 

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

Братан, ты пишешь ТЗ конечно, я весь мозг сломал пытаясь понять что нужно )) Давай я начну предлагать, ты говори что не так.

Если я правильно понял, то нужно по attribute_id (или по text) найти все товары, которые содержат 2+ атрибутов. Ниже вариант, что в нем не так?

 

SELECT `product_id` FROM `oc_product_attribute` WHERE `text` = "16GB" OR `text` = "4" GROUP BY `product_id`


Выведет тебе все product_id, которые удовлетворяют установленным условиям (содержат атрибуты в виде текста) и сгруппирует их. Потом приджоинишь еще таблицу с названием продуктов, если нужно - и все.

 

Или вариант с IN, будет проще кодить.

SELECT `product_id` FROM `oc_product_attribute` WHERE (`text` IN ("16GB", "4")) GROUP BY `product_id`;

 

Змінено користувачем Gorman
  • +1 1
Надіслати
Поділитися на інших сайтах

Такс, прочитал еще пару раз, кажется, понял проблему лучше )) В моем примере выше выберутся все товары, даже те, которые соответствуют только одному атрибуту.

Порылся в интернете, одно из решений из стаковерфлоу. Выглядит жестко, как масштабировать - вопрос. Не знаю насколько будет тяжко базе, надо тестить. Ну, и может кто-то более правильный вариант подскажет. Ибо сначала показалось, что задача вообще примитивная, на деле не такая уж  

Попробуйте, в общем. Возможно, натолкнет на мысли.

Запрос для двух атрибутов.

 

SELECT DISTINCT(`product_id`) FROM `oc_product_attribute`

WHERE `product_id` IN 

  (SELECT `product_id` FROM `oc_product_attribute` WHERE `text` = 'Intel') 

AND `product_id` IN 

  (SELECT `product_id` FROM `oc_product_attribute` WHERE `text` = 'E-ATX') 

 

Змінено користувачем Gorman
Надіслати
Поділитися на інших сайтах

23 часа назад, Gorman сказал:

Такс, прочитал еще пару раз, кажется, понял проблему лучше )) В моем примере выше выберутся все товары, даже те, которые соответствуют только одному атрибуту.

Порылся в интернете, одно из решений из стаковерфлоу. Выглядит жестко, как масштабировать - вопрос. Не знаю насколько будет тяжко базе, надо тестить. Ну, и может кто-то более правильный вариант подскажет. Ибо сначала показалось, что задача вообще примитивная, на деле не такая уж  

Попробуйте, в общем. Возможно, натолкнет на мысли.

Запрос для двух атрибутов.

 


SELECT DISTINCT(`product_id`) FROM `oc_product_attribute`

WHERE `product_id` IN 

  (SELECT `product_id` FROM `oc_product_attribute` WHERE `text` = 'Intel') 

AND `product_id` IN 

  (SELECT `product_id` FROM `oc_product_attribute` WHERE `text` = 'E-ATX') 

 

Я это не понимаю конечно, но спасибо) Ох ж этот opencart, за все надо платить или мучиться
Притом, что проект для обучения....

Змінено користувачем YanGus
Надіслати
Поділитися на інших сайтах


1 час назад, YanGus сказал:

за все надо платить или мучиться

Что мучится что платить одно
-иначе только в раю

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


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

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

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

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

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

Вхід

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

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

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

Important Information

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