Автор Тема: Не работает двойная сортировка товара  (Прочитано 198 раз)

09 Апрель 2020, 01:39:27
  • Фрилансер
  • *
  • Сообщений: 142
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Prestashop 1.6, модуль для фильтрации использую blocklayered
Пытаюсь сделать двойную сортировку (наличие, цена) пытался сделать так.
В админке в настройках -> товары сделал вывод по наличию по убыванию
в файле класса категории /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;
}
И по цене всё равно не сортирует( что не так?
Код взят с другой темы на этом форуме, в php я не очень силен.
09 Апрель 2020, 11:33:40
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 1220
  • Репутация: +8/-1
  • Сообщество PrestaShop
    • Просмотр профиля
ORDER BY stock.`quantity` DESC, p.`price` ASC;в запросе сортирует по 2-м параметрам
09 Апрель 2020, 11:43:19
Ответ #2
09 Апрель 2020, 11:59:14
Ответ #3
  • Фрилансер
  • *
  • Сообщений: 142
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
ORDER BY stock.`quantity` DESC, p.`price` ASC;в запросе сортирует по 2-м параметрам
Где это нужно вставить?
09 Апрель 2020, 12:01:45
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 21963
  • Репутация: +25298/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
ORDER BY IF(stock.`quantity`>0,1,0) DESCэто зачем? можно просто по количеству
ORDER BY stock.`quantity` DESC
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
09 Апрель 2020, 13:18:37
Ответ #5
  • Фрилансер
  • *
  • Сообщений: 142
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
ORDER BY IF(stock.`quantity`>0,1,0) DESCэто зачем? можно просто по количеству
ORDER BY stock.`quantity` DESC
elseif ($order_by == 'quantity') {
$sql .= ' ORDER BY stock.`quantity` 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;
}

Так правильно? Всё равно не хочет по цене фильтровать если в админке указано по товару ну или наоборот если в админке по цене по потом по наличию не фильтрует((
09 Апрель 2020, 15:23:46
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 1504
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Сортировку по цене + "еще какой-то параметр" нужно менять в Tools::orderbyPrice
В классе Category.php в методе getProducts сортировка по цене в самом конце метода
if ($order_by == 'orderprice') {
      Tools::orderbyPrice($result, $order_way);
}
и менять сортировку нужно будет в массиве, а не в sql запросе
09 Апрель 2020, 15:26:43
Ответ #7
  • Фрилансер
  • *
  • Сообщений: 142
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Сортировку по цене + "еще какой-то параметр" нужно менять в Tools::orderbyPrice
В классе Category.php в методе getProducts сортировка по цене в самом конце метода
if ($order_by == 'orderprice') {
      Tools::orderbyPrice($result, $order_way);
}
и менять сортировку нужно будет в массиве, а не в sql запросе
Тоесть код который я написал выше я возвращаю как и было по дефолту.
Ставлю в админке сортировку по наличию а в коде в методе getProducts
if ($order_by == 'orderprice') {
      Tools::orderbyPrice($result, $order_way);
}
и всё? + какой параметр я должен написать в этот код?
09 Апрель 2020, 16:21:54
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 1504
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Код возвращаете, устанавливаете сортировку по наличию и добавляете в getProducts
elseif ($order_by == 'quantity') {
$sql .= ' ORDER BY `quantity` DESC LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
...
if ($order_by == 'orderprice' || $order_by == 'quantity') {
            Tools::orderbyPrice($result, $order_way);
}
09 Апрель 2020, 16:39:22
Ответ #9
  • Фрилансер
  • *
  • Сообщений: 142
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Код возвращаете, устанавливаете сортировку по наличию и добавляете в getProducts
elseif ($order_by == 'quantity') {
$sql .= ' ORDER BY `quantity` DESC LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
...
if ($order_by == 'orderprice' || $order_by == 'quantity') {
            Tools::orderbyPrice($result, $order_way);
}

if ($random === true) {
            $sql .= ' ORDER BY RAND() LIMIT '.(int)$random_number_products;
        } else {
            $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way).'
LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
        }

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql, true, false);

        if (!$result) {
            return array();
        }

        elseif ($order_by == 'quantity') {
$sql .= ' ORDER BY `quantity` DESC LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}

if ($order_by == 'orderprice' || $order_by == 'quantity') {
            Tools::orderbyPrice($result, $order_way);
}

        /** Modify SQL result */
        return Product::getProductsProperties($id_lang, $result);
    }
Вот так? - по наличию фильтрует а по цене нет(( или я elseif не туда вставил?
09 Апрель 2020, 17:08:10
Ответ #10
  • Ветеран
  • *****
  • Сообщений: 1504
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Не правильно
if ($random === true) {
    $sql .= ' ORDER BY RAND() LIMIT '.(int)$random_number_products;
} elseif ($order_by == 'quantity') {
$sql .= ' ORDER BY `quantity` DESC LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
} else {
    $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way).'
LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
10 Апрель 2020, 00:21:04
Ответ #11
  • Фрилансер
  • *
  • Сообщений: 142
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Не правильно
if ($random === true) {
    $sql .= ' ORDER BY RAND() LIMIT '.(int)$random_number_products;
} elseif ($order_by == 'quantity') {
$sql .= ' ORDER BY `quantity` DESC LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
} else {
    $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way).'
LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}

Сделал, всё равно фильтрует только по одному параметру(
10 Апрель 2020, 11:55:08
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 1504
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
if ($order_by == 'orderprice' || $order_by == 'quantity') {
        Tools::orderbyPrice($result, $order_way);
}
это тоже добавили?
10 Апрель 2020, 15:55:36
Ответ #13
  • Фрилансер
  • *
  • Сообщений: 142
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
if ($order_by == 'orderprice' || $order_by == 'quantity') {
        Tools::orderbyPrice($result, $order_way);
}
это тоже добавили?
Да и это добавил!
10 Апрель 2020, 16:43:00
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 1504
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Модуль фильтров может мешать. Отключите его и проверьте.