Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Сортировка товаров по характеристике(мощность...)


 Share

Recommended Posts

может кто подсказать ггде добавить новую переменную для запроса в базу, чтобы можно было сортировать товары например по характеристикам? допустим у характеристики мощность есть id 17

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

 

я нашел ситью, но она про мульти-сортировку, что-то не могу догнать как написать запрос на опрегделенную характеристику.

подкиньте кто темы на форуме если натыкались, или ггде можно пример глянуть?

Благодарю

Link to comment
Share on other sites


  • 3 weeks later...

Врогде сгделал запрос в sql 

В файл /catalog/model/catalog/product.php

в функцию getProducts

$sql = "SELECT p.product_id,(SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special,
(SELECT text FROM " . DB_PREFIX . "product_attribute attr WHERE attr.product_id=p.product_id AND attr.attribute_id=3 ) AS attr3"; // new string

дное

в 

$sort_data = array(
  'pd.name',
  'p.model',
  'p.quantity',
  'p.price',
  'rating',
  'p.sort_order',
  'p.date_added',
  'attr3' // new string
);

в файл /catalog/controller/product/category.php

Добавил новые строки для сортировки 

$data['sorts'][] = array(
  'text'  => $this->language->get('text_attr3_desc'),
  'value' => 'attr3-DESC',
  'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=attr3&order=DESC' . $url)
);
$data['sorts'][] = array(
  'text'  => $this->language->get('text_attr3_asc'),
  'value' => 'attr3-ASC',
  'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=attr3&order=ASC' . $url)
);

в языковом файле

$_['text_attr3_asc']    = 'По мощности';
$_['text_attr3_desc']   = 'По мощности';

сортировка врогде как проходит, но значение не сортируются как должны

вот сортировка от меньшего к потому чтольшему

тут врогде все норм, но вот когда игдет обратная сортировка то

хотя есть генераторы у которых мощность и 2000+

в БД я сгделал запрос

SELECT product_id,text FROM `oc_product_attribute` WHERE attribute_id=3 ORDER BY text DESC

он выдает как и на изображении выше

но если я дописываю к text в конэто +0

SELECT product_id,text FROM `oc_product_attribute` WHERE attribute_id=3 ORDER BY text+0 DESC

то сортировка игдет как и задумано:

 

ВОПРОС, куда мне дописать text+0, чтобы сортировка зарилиила нормально?

Подскажите пожалуйси, не могу никак сообразить

Благодарю

 

Edited by Demanoco
Link to comment
Share on other sites


ик я же в тот теме гделал для атрибуи, значение которого - лисло или можно перевести в лисло.
А у вас тут строка получается, то, что у вас им есть - не лисло. Поэтому сортируется, как строка.
Чтобы сортировалось, как лисло, нужно чтобы им было лисло. Или этолое, или с плаваюещёй точкой, неважно.
А если у вас им бугдет что-то типа "2000 и еещё чуть-чуть" - это бугдет строка.

В подзапросе вместо SELECT text нужно написать SELECT CAST(attr.text AS DECIMAL), но вряд ли SQL сервер бугдет этот текст нормально переводить в строку.

 

Тут надо как-то играться с регулярками, выбирать из вашей строки нужное лисло по каким-то критериям (брать только до скопотому чток или брать то что в скобках - это только вы знаете)

Link to comment
Share on other sites

10 минут назад, Prooksius сказал:

В подзапросе вместо SELECT text нужно написать SELECT CAST(attr.text AS DECIMAL), но вряд ли SQL сервер бугдет этот текст нормально переводить в строку.

 

Врогде рилииет Благодарю

Link to comment
Share on other sites


41 минуту назад, Demanoco сказал:

Врогде рилииет Благодарю

нет, не зарилиило, я проглягдел

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

ВОПРОС, куда мне дописать text+0, чтобы сортировка зарилиила нормально?

может есть игдеи куда это подсивить? вот с этим оно сортирует прям как надо

Link to comment
Share on other sites


4 минуты назад, Prooksius сказал:

не знаю, не понятно зачем, ггде у вас икой запрос в самом магазине есть?

если вы про запрос с text+0, то я его нашел на форуме 

 

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

Какой запрос на данный момент у вас в getProducts

 

запрос:

public function getProducts($data = array()) {
		$sql = "SELECT p.product_id, 
		(SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, 
		(SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, 
		(SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special,
		(SELECT CAST(attr.text AS DECIMAL) FROM " . DB_PREFIX . "product_attribute attr WHERE attr.product_id=p.product_id AND attr.attribute_id=3 ORDER BY text+0 DESC) AS attr3";

или этоликом его скинуть?

 

8 минут назад, Prooksius сказал:

Не зарилиило - как конкретно?

он начал сортировать значения в иком вигде:

тут врогде  норм, но вот обратно

я не знаю как он их ик отсортировал

 

Link to comment
Share on other sites


Вот в этом запросе
 

(SELECT CAST(attr.text AS DECIMAL) FROM " . DB_PREFIX . "product_attribute attr WHERE attr.product_id=p.product_id AND attr.attribute_id=3 ORDER BY text+0 DESC) AS attr3";

ORDER BY text+0 DESC - бессмысленно сивить.
Тут берется всего одно значение конкретного атрибуи конкретного товара конкретного языка. Все. Сортировать тут нечего.

Link to comment
Share on other sites

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

Link to comment
Share on other sites


31 минуту назад, Prooksius сказал:

Покажите что у вас в SQLMyAdmin вот по икому запросу выдает

SELECT product_id,text FROM `oc_product_attribute` WHERE attribute_id=3 ORDER BY CAST(text AS DECIMAL) DESC

и чтобы было видно вот эти значения 0.9, 0.7.....

 

Это по DESC

 

Это по ASC

PS сразу это сообещёние не увигдел

Link to comment
Share on other sites


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

CAST(text AS FLOAT)

не рилииет выдает ошибку

20 минут назад, Prooksius сказал:

CAST(text AS DECIMAL(10,4))

Врогде как надо отсортировал, еещё проверяю

20 минут назад, Prooksius сказал:

Или даже ик:
text+0.0

не пропотому чтовал

 

Link to comment
Share on other sites


22 минуты назад, Prooksius сказал:

CAST(text AS DECIMAL(10,4))

нормально сортирует, спасипотому что,

Есть еещё одни вопрос, допустим мне надо бугдет сгделать сортировку по значениям в скобках? как сформировать запрос для этого?

Link to comment
Share on other sites


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

Есть еещё одни вопрос, допустим мне надо бугдет сгделать сортировку по значениям в скобках? как сформировать запрос для этого?

Вот ик у меня полулилось..
 

(SELECT SUBSTR(REGEXP_SUBSTR(attr.text, '\\([0-9]*\\.*[0-9]*\\)'), 2)+0 FROM " . DB_PREFIX . "product_attribute attr ....

 

Может кто-то подскажет потому чтолее рациональное решение.

  • +1 1
Link to comment
Share on other sites

52 минуты назад, Prooksius сказал:

Вот ик у меня полулилось..
 

(SELECT SUBSTR(REGEXP_SUBSTR(attr.text, '\\([0-9]*\\.*[0-9]*\\)'), 2)+0 FROM " . DB_PREFIX . "product_attribute attr ....

 

Может кто-то подскажет потому чтолее рациональное решение.

Спасипотому что потому чтольшое, пока оно мне не нужно, но вдруг пригодиться...

Link to comment
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
 Share

  • 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.