У системі OpenCart стандартна функція сортування товарів є досить обмеженою і не враховує специфічні потреби, такі як сортування за статусами на складі або за кількістю товарів. У цій статті ми розглянемо, як реалізувати сортування товарів за статусами та як змінити порядок відображення товарів таким чином, щоб товари з нульовою кількістю залишались в кінці списку.
Навіщо це потрібно?
У деяких магазинах важливо, щоб товари зі статусом “В наявності” відображались на початку списку, а товари, які “Очікуються” або “Немає в наявності”, з’являлися пізніше. Інший популярний сценарій — сортування за кількістю, коли товари з нульовою кількістю автоматично переміщуються в кінець списку, щоб уникнути плутанини для покупців.
Як налаштувати сортування за статусами
Щоб сортувати товари за статусами, скористаємося функцією CASE у SQL-запиті, яка дозволяє задати порядок сортування для кожного статусу.
Код для сортування за статусами
Відкрийте файл catalog/model/catalog/product.php та знайдіть функцію getProducts. Вона відповідає за формування SQL-запиту для вибірки товарів. Додайте наступний код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $status_order = "(CASE WHEN p.stock_status_id = 7 THEN 1 /* В наявності */ WHEN p.stock_status_id = 6 THEN 2 /* Очікування 2-3 дні */ WHEN p.stock_status_id = 10 THEN 3 /* Очікується */ WHEN p.stock_status_id = 9 THEN 4 /* В дорозі */ WHEN p.stock_status_id = 8 THEN 5 /* Під замовлення */ WHEN p.stock_status_id = 5 THEN 6 /* Немає в наявності */ ELSE 7 /* Інші статуси */ END)"; if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') { $sql .= " ORDER BY $status_order ASC, LCASE(" . $data['sort'] . ")"; } elseif ($data['sort'] == 'p.price') { $sql .= " ORDER BY $status_order ASC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)"; } else { $sql .= " ORDER BY $status_order ASC, " . $data['sort']; } } else { $sql .= " ORDER BY $status_order ASC, p.sort_order ASC"; } if (isset($data['order']) && ($data['order'] == 'DESC')) { $sql .= " DESC, LCASE(pd.name) DESC"; } else { $sql .= " ASC, LCASE(pd.name) ASC"; } |
Цей код:
- Сортує товари за статусами на складі відповідно до заданого порядку.
- Дозволяє враховувати інші сортування (наприклад, за ціною чи назвою), додаючи їх після сортування за статусами.
Як сортувати товари за кількістю (0 в кінці)
Інколи потрібно, щоб товари, яких немає на складі (кількість = 0), переміщувались у кінець списку. Це можна реалізувати, додавши ще один блок CASE до SQL-запиту.
Код для сортування за кількістю
Додайте наступне до вашого запиту:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $status_order = "(CASE WHEN p.stock_status_id = 7 THEN 1 /* В наявності */ WHEN p.stock_status_id = 6 THEN 2 /* Очікування 2-3 дні */ WHEN p.stock_status_id = 10 THEN 3 /* Очікується */ WHEN p.stock_status_id = 9 THEN 4 /* В дорозі */ WHEN p.stock_status_id = 8 THEN 5 /* Під замовлення */ WHEN p.stock_status_id = 5 THEN 6 /* Немає в наявності */ ELSE 7 /* Інші статуси */ END)"; if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') { $sql .= " ORDER BY $status_order ASC, LCASE(" . $data['sort'] . ")"; } elseif ($data['sort'] == 'p.price') { $sql .= " ORDER BY $status_order ASC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)"; } else { $sql .= " ORDER BY $status_order ASC, " . $data['sort']; } } else { $sql .= " ORDER BY $status_order ASC, p.sort_order ASC"; } if (isset($data['order']) && ($data['order'] == 'DESC')) { $sql .= " DESC, LCASE(pd.name) DESC"; } else { $sql .= " ASC, LCASE(pd.name) ASC"; } |
Цей код:
- Переміщує товари з кількістю > 0 на початок списку.
- Товари з нульовою кількістю переміщуються в кінець (оскільки їх значення у CASE — 2).
- Додає можливість враховувати інші сортування.
Висновок
Сортування товарів за статусами або кількістю — це важливе покращення для магазину на OpenCart, яке допомагає зробити відображення товарів більш зручним для покупців. За допомогою конструкції CASE у SQL-запиті можна легко налаштувати порядок сортування, враховуючи статуси товарів або їх кількість на складі. Якщо у вас виникнуть питання чи труднощі, завжди можна звернутися до спільноти OpenCart або залишити коментар у нашому блозі.

