Урок 21 Товары с «нулевой» ценой в конце списка

Нулевая цена для товара в магазине на базе opencart (ocstore) может использоваться для решения разных задач. Например, в качестве основной цены используется цена опции. А иногда нулевую цену используют как условия для запрета совершения покупки данного товара, оставляя при этом товар в каталоге для расширения семантики магазина.
Однако наличие таких товаров вперемешку с товарами, которые можно приобрести, портит визуальную картину и раздражает покупателей. Чтобы исправить ситуацию, такие товары лучше всего выводить в конце общего списка доступных к покупке товаров. И сделать это очень просто. Изменения вносятся только в один файл, а именно в модель продукта по адресу
1 |
catalog/model/catalog/product.php |
В ocstore 2.1 примерно строка 160 метод getProducts(), ocstore 2.3 примерно строка 169 метод getProducts()
Находим код
1 2 3 4 5 6 7 8 9 10 11 |
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') { $sql .= " ORDER BY LCASE(" . $data['sort'] . ")"; } elseif ($data['sort'] == 'p.price') { $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)"; } else { $sql .= " ORDER BY " . $data['sort']; } } else { $sql .= " ORDER BY p.sort_order"; } |
и меняем его на следующий
1 2 3 4 5 6 7 8 9 10 11 |
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') { $sql .= " ORDER BY IF(p.price = '0', 1, 0), LCASE(" . $data['sort'] . ")"; } elseif ($data['sort'] == 'p.price') { $sql .= " ORDER BY IF(p.price = '0', 1, 0), (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)"; } else { $sql .= " ORDER BY IF(p.price = '0', 1, 0), " . $data['sort']; } } else { $sql .= " ORDER BY IF(p.price = '0', 1, 0), p.sort_order"; } |
И сохраняем. Если используются модификаторы, не забываем обновлять кеш модификаторов. Смотрим и радуемся результату. Также как всегда выкладываю готовый модификатор.
На OpenCart 2.3 работает!
Очень благодарен!
Хорошо что пригодилось)
а можно это как-либо реализовать через контроллер product.php или через шаблон категории .tpl ?
в рабочем проекте стоит brainy filter, который заменяет метод getProducts() на свой и я не до конца разобрался, как устроен сам фильтр.
Поэтому и возник вопрос, как еще можно отодвинуть с ценой 0 в конец списка каталога?
Спасибо!
Только дорабатывать этот метод в модели по аналогии со стандартным. Это специфическая доработка под модуль и Вы его вряд ли найдете.
Попробовал для Опенкарт 3.0.3.2 получил ошибку 500(((
Подскажите пожалуйста как реализовать?
Спасибо
Повторил все на чистой сборке 3.0.3.2 — все работает отлично. Если у Вас не дефолтный шаблон — тогда ищите какой из модификаторов вносит изменения в модель товара. Все примеры разбираются для шаблона по умолчанию. Работа на других шаблонах не гарантируется.