Недавно столкнулся с тем что мне надо было сделать сортировку по цене от меньшего к большему на странице Акции (product/special). Вся проблема заключается в том что такая сортировка предусмотрена в Opencart на странице акций, но она неправильно работает.
Вообще, что бы задать сортировку на странице категории где есть перечень товаров достаточно указать ее вверху файла а именно задать строку
$sort = 'p.price';
и немного ниже указать ASC или DESC, например
$order = 'ASC';
В таком случае у нас товары в категориях буду сортироваться по цене от меньшей и большей.
Но на странице акций этот трюк не подойдет. Почему так?
Дело в том что на этой странице все товары идут акционные и цена их берется из таблицы product_special где цена обозначается как ps.price. Но все равно когда мы поставили эти значения у нас нет сортировки по цене. Проблема в том что mysql там сортирует как текстовое значение а не как числовое. Для того что бы работало нам надо просто добавить в сортировку +0. Таким образом мы переведем в числовой формат и сортировка будет натуральной.
До изменений сортирует так: 1000, 11, 147 и т.п.
После правок сортировать будет как надо: 11, 147, 1000
Итак, приступим. Открываем файл catalog/model/catalog/product.php и находим метод getProductSpecials где строку:
$sql .= ' ORDER BY ' . $data['sort'];
Заменяем на:
if ($data['sort'] == 'ps.price') {
$sql .= ' ORDER BY (' . $data['sort'] . '+0)';
}else{
$sql .= ' ORDER BY ' . $data['sort'];
}
чистим модификаторы и наслаждаемся результатами :)