Автор Тема: Сортировка товаров Prestashop. Сначала по наличию, а потом по цене.  (Прочитано 8967 раз)

18 Март 2014, 22:35:47
Ответ #15
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Покажите код где меняли, так можно будет найти ошибку.
19 Март 2014, 10:07:01
Ответ #16
  • Новичок
  • *
  • Сообщений: 44
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Заменил в sql запросе сортировку
$sql = 'SELECT p.*, product_shop.*, pl.* , m.`name` AS manufacturer_name, s.`name` AS supplier_name
FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` '.Shop::addSqlRestrictionOnLang('pl').')
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (s.`id_supplier` = p.`id_supplier`)'.
($id_category ? 'LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)' : '').'
WHERE pl.`id_lang` = '.(int)$id_lang.
($id_category ? ' AND c.`id_category` = '.(int)$id_category : '').
($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
($only_active ? ' AND product_shop.`active` = 1' : '').'
ORDER BY  p.`price` ASC , p.`quantity` ASC LIMIT '.(int)$start.','.(int)$limit : '');
Было:
ORDER BY '.(isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).($limit > 0 ? ' LIMIT '.(int)$start.','.(int)$limit : '');не работает(((
19 Март 2014, 15:00:56
Ответ #17
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 105673
  • Репутация: +39553/-0
    • Просмотр профиля
    • Webstudio UwK
Чтобы сделать сортировку по 2 значениям, нужно изменить функцию
public static function getProducts($id_lang, $start, $limit, $order_by, $order_way, $id_category = false, $only_active = false, Context $context = null)в классе Product.
Там задается сортировка
ORDER BY '.(isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).
Для страницы категорий метод getProducts в классе Category (файл /classes/Category.php).
Изменить порядок сортировки можно в нем.

Я активно юзаю Блок Многоуровневой навигации, но я не понимаю, как он может повлиять на сортировку.
Если у вас установлен модуль Блок Многоуровневой, то описанный метод не будет работать. Так как блок товаров переписывается этим модулем. Ищите в файле blocklayered.php "ORDER BY..." и измените под ваши требования.
Cоздание интернет сайтов Webstudio UwK
19 Март 2014, 15:15:50
Ответ #18
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В модуле blocklayered, для показа в конце товаров с нулевым количеством сортировку делать вот так
public function getProductByFilters($selected_filters = array())
{
....
        ORDER BY p.`quantity`, p.`price` DESC LIMIT '.(((int)$this->page - 1) * $n.','.$n));
20 Март 2014, 10:40:03
Ответ #19
  • Новичок
  • *
  • Сообщений: 44
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В модуле blocklayered, для показа в конце товаров с нулевым количеством сортировку делать вот так
public function getProductByFilters($selected_filters = array())
{
....
        ORDER BY p.`quantity`, p.`price` DESC LIMIT '.(((int)$this->page - 1) * $n.','.$n));

Большое спасибо за помощь, мир не без добрый людей!
Оно вроде работает если стоит сортировка по умолчанию по количеству товаров.
При этом по цене не сортирует. 
Проверил. Поставил количество 100 у двух товаров. 
потом поставил разные цены. у первого 10 у второго 20.
потом там, где цена меньше поставил количетво 0. Этот товар ушел в конец. тут все верно.
Потом вернул ему количество 100.
опять пошел на 1 место. тоже все верно.
ПОтому поставил товару у которого цена 10, цену 30 и он всеравно остался на первом месте. хотя должен был быть после товара с ценой 20.

20 Март 2014, 11:55:29
Ответ #20
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Сортировка зависит от серверного по, версии mysql. Этот метод не такой гибкий, зато не требует больших изменений. И не повышает нагрузку на сервер.
Чтобы сортировать обновремено по нескольким параметрам и в разных направлениях, нужно делать вложенные запросы.
Но модуль фильтров и так сильно нагружает сайт. Если добавить еще вложенный запрос, то увеличиться нагрузка не сервер.
Оставьте все как есть или используйте модуль Расширенный поиск, а не модуль Блок Многоуровневой.
25 Декабрь 2014, 12:40:25
Ответ #21
  • Новичок
  • *
  • Сообщений: 1
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Требовалась такая же задача - двойная сортировка товаров по наличию и по цене, сделал так:
в административной части "Настройки >  товары" установил сортировку по кол-ву товара и по убыванию,
в файле класса категории /classes/Category.php
заменил
else
$sql .= ' ORDER BY '.(isset($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).'
LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
на

elseif ($order_by == 'quantity') {
$sql .= ' ORDER BY IF(stock.`quantity`>0,1,0) DESC, p.`price` ASC LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
} else {
$sql .= ' ORDER BY '.(isset($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).'
LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
в итоге получилось во фронте, в категории - по умолчанию сортировка по наличию, сначала идут товары в наличии, отсортированные по цене, после них идут товары, которых нет на складе и тоже отсортированы по цене.
остальные варики  сортировки остаются рабочими при этом,
может кому и пригодится сей вариант ;)
21 Август 2018, 19:20:03
Ответ #22
  • Пользователь
  • **
  • Сообщений: 73
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
А как же всё-таки сделать чтобы товары у которых цена = 0 при сортировке по возрастанию цены были в конце списка?