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

Как можно вывести сортировку по атрибуту товара? (По attribute_id).


Recommended Posts

Стоит Стоит Opencart 3.0.3.8 (rs.2).

Подскажите, как можно вывести сортировку по атрибуту товара?

Атрибуты, как я понимаю, находятся в базе данных в таблице oc_product_attribute.

Нужный attribute_id, по которому требуется сделать сортировку — 89.

Я так понимаю, что в где-то в файле ok/catalog/model/catalog/product.php нужно что-то сделать? Но что и как?

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


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

Вы сначала обьясните как вы сортировку по атрибуту себе представили. У этого атрибута какие значения?

У этого атрибута целые числовые: 7, 9, 12, 55, 75, 100, 200.

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


7 минут назад, petyann сказал:

У этого атрибута целые числовые: 7, 9, 12, 55, 75, 100, 200.

 

вам нужно сделать скрипт который будет копировать значения атрибута в какое-то поле в товаре существующее или создать новое - а уже потом сортировать по нему

таблицу атрибутов дергать это больновато

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

14 минут назад, spectre сказал:

 

вам нужно сделать скрипт который будет копировать значения атрибута в какое-то поле в товаре существующее или создать новое - а уже потом сортировать по нему

таблицу атрибутов дергать это больновато

Если сделать через новый столбец в самой базе данных (ввести их даже вручную) и по нему сортировать, то это не проблема. Просто думал, что можно как-то проще подключить oc_product_attribute и сортировать через attribute_id.

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


Можно и через атрибуты, конечно, просто такой запрос, возможно, будет сильно тормозить.
Если много товаров и много атрибутов - записей в таблице товарных атрибутов может быть очень много и время на запрос может увеличиться непомерно.
Поэтому, правильный совет, быстрее будет скопировать в какое-то поле товара и по нему. Ну как power))

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

58 минут назад, petyann сказал:

Я так понимаю, что в где-то в файле ok/catalog/model/catalog/product.php нужно что-то сделать? Но что и как?

Переписать (или сделать альтернативный вариант) getProducts с присоединением таблиц атрибутов и сортировкой по ним. Выбирать может долго.

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


Если немного товаров и атрибутов, не будет тормозить, тогда вот так можно.

В запросе в модели getProducts добавить через запятую в основной SELECT еще одно "поле" - вложенный SELECT:
 

(SELECT CAST(pa.text AS UNSIGNED) FROM " . DB_PREFIX . "product_attribute pa WHERE pa.product_id = p.product_id AND pa.attribute_id = <ваш attribute_id> AND pa.language_id = '" . (int)$this->config->get('config_language_id') . "' LIMIT 1) AS your_attr

 

<ваш attribute_id> = 89

и добавить "your_attr" в массив возможных полей для сортировки ниже по тексту.

Ну и в контроллере добавить в выпадающее эту сортировку по полю "your_attr" (без p)

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

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

Если немного товаров и атрибутов, не будет тормозить, тогда вот так можно.

В запросе в модели getProducts добавить через запятую в основной SELECT еще одно "поле" - вложенный SELECT:
 




(SELECT CAST(pa.text AS UNSIGNED) FROM " . DB_PREFIX . "product_attribute pa WHERE pa.product_id = p.product_id AND pa.attribute_id = <ваш attribute_id> AND pa.language_id = '" . (int)$this->config->get('config_language_id') . "' LIMIT 1) AS your_attr

 

<ваш attribute_id> = 89

и добавить "your_attr" в массив возможных полей для сортировки ниже по тексту.

Ну и в контроллере добавить в выпадающее эту сортировку по полю "your_attr" (без p)

Спасибо большое.

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


там получается, если атрибут в каких-то товарах не заполнен, он рассматривается как 0 и эти товары встают в начало (причем как попало), если сортировать по возр.
Возможно, нужно будет как-то дорабатывать, чтобы товары еще дополнительно сортировались по имени или sort_order.

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

Только что, Prooksius сказал:

там получается, если атрибут в каких-то товарах не заполнен, он рассматривается как 0 и эти товары встают в начало (причем как попало), если сортировать по возр.
Возможно, нужно будет как-то дорабатывать, чтобы товары еще дополнительно сортировались по имени или sort_order.

в таком случае таблицу над джойнить

Или использовать CASE

 

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

6 минут назад, chukcha сказал:

в таком случае таблицу над джойнить

да собственно, оно и правильно что так отдает, по-другому я не знаю как.. Где непроставлено - пусть будет 0, раз это числовой параметр.
А подзапрос тут мне кажется лучше, все товары в любом случае отобразятся. Пусть даже с незаполненным атрибутом.
Да и сам подзапрос делается по полям primary key - должно быть быстро все.

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

(SELECT IF(COUNT(*) > 0, CAST(pa.text AS INT), 0)
FROM " . DB_PREFIX . "product_attribute pa 
WHERE pa.product_id = p.product_id 
AND pa.attribute_id = 1 
AND pa.language_id = '" . (int)$this->config->get('config_language_id') . "' 
LIMIT 1) AS desc_attr

немного поменял чтобы если атрибут не заполнен, выдавало бы точно 0, а не NULL
Хотя, это особо и не важно.

А двойная сортировка, проверил, вроде все работает.

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

или так
 

(SELECT IF(COUNT(*) > 0, CAST(pa.text AS INT), 22222222222)
FROM " . DB_PREFIX . "product_attribute pa 
WHERE pa.product_id = p.product_id 
AND pa.attribute_id = 1 
AND pa.language_id = '" . (int)$this->config->get('config_language_id') . "' 
LIMIT 1) AS desc_attr

и сортировать как обычно

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

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

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

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

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

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

Вхід

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

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

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

Important Information

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