Cортировка товаров по цене: товары с нулевой ценой в конце списка

Всем привет!

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

Проблема: если указать вариант сортировка «Дешёвые выше» то все товары, стоимость которых равна нулю, будет в самом верху позиции, мешая отображению товаров с открытой ценой.

Задача: нужно, чтобы товары с нулевой ценой всегда отображались после товаров с открытыми ценами.

На форуме натыкался на ссылки сторонних модулей, но они работают с «нулевым наличием». Возможно можно внести правку в каком-нибудь файле для правки сортировки или есть какой-нибудь готовый модуль, который я не видел. Буду признателен за наводку.

[eCom Labs] Сортировка По Наличию
сортирует, но не работает с мультискладовостью

1 лайк

К сожалению, этот модуль сортирует только по наличию. А мне нужно по цене: нулевая цена — в конце списка.

Техподдержка дала наводку, что за сортировку отвечает функция fn_get_products в файле app/functions/fn.products.php. Кто может подсказать что нужно прописать, чтобы товары без цены были в конце?

Я вас понял, но очень интересно в какой ситуации может быть нулевая цена и товар при этом в наличии?

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

В обоих случаях товара нет в наличии на складе, но цены при этом могут быть открыты и закрыты. Поэтому и приоритет отображения по цене :slight_smile:

1 лайк

Присоединяюсь к вопросу, никто не реализовал ?
Я так понимаю, что надо прописать условие, при котором будет сортировка от меньшего (выше нуля) к большему

Подключаетесь к хуку get_products из файла fn.products.php. И модифицируете 2 переменные - $fields и $sortings. Для выборки из базы с правильной сортировкой надо добавить вот такую строчку:

$fields['sort_zero_price'] = 'IF(prices.price = 0, 0, 1) AS zero_price_last';

После этого добавьте это правило сортировки в массив $sortings, дополнительным полем.
Например для сортировки по цене сделать так:
$sortings['price'] = [ 'zero_price_last', 'price' ];

1 лайк

Спасибо!

Попробовал данный метод — увы, сортировка осталась как и прежде. Возможно я что-то упустил?

Разместите тут код, который вы добавили. Возможно, вы что-то упустили :slight_smile:

function fn_my_changes_get_products($fields, $sortings) {
    $fields['sort_zero_price'] = 'IF(prices.price = 0, 0, 1) AS zero_price_last';
    $sortings['price'] = [ 'zero_price_last', 'price' ];
}

Попробуйте так

function fn_my_changes_get_products($params, &$fields, &$sortings, $condition, $join, $sorting, $group_by, $lang_code, $having) {
    $fields['sort_zero_price'] = 'IF(prices.price = 0, 0, 1) AS zero_price_last';
    $sortings['price'] = [ 'zero_price_last', 'price' ];
}

(!) Не тестировано

И в init.php хук объявить не забудьте

Падает с такой ошибкой:

Unknown column ‘prices.price’ in ‘field list’ (1054)

Error at
app/Tygh/Database/Connection.php, line: 1540

А вот так если

function fn_my_changes_get_products($params, &$fields, &$sortings, $condition, $join, $sorting, $group_by, $lang_code, $having) {
    if (in_array('prices', $params['extend'])) {
        $fields['sort_zero_price'] = 'IF(prices.price = 0, 0, 1) AS zero_price_last';
        $sortings['price'] = [ 'zero_price_last', 'price' ];
    }
}

Попробовал, теперь не падает, но и сортировка осталась прежней: с нулевой ценой всё равно сверху)