У системі OpenCart стандартна функція сортування товарів є досить обмеженою і не враховує специфічні потреби, такі як сортування за статусами на складі або за кількістю товарів. У цій статті ми розглянемо, як реалізувати сортування товарів за статусами та як змінити порядок відображення товарів таким чином, щоб товари з нульовою кількістю залишались в кінці списку.
Навіщо це потрібно?
У деяких магазинах важливо, щоб товари зі статусом “В наявності” відображались на початку списку, а товари, які “Очікуються” або “Немає в наявності”, з’являлися пізніше. Інший популярний сценарій — сортування за кількістю, коли товари з нульовою кількістю автоматично переміщуються в кінець списку, щоб уникнути плутанини для покупців.
Як налаштувати сортування за статусами
Щоб сортувати товари за статусами, скористаємося функцією CASE у SQL-запиті, яка дозволяє задати порядок сортування для кожного статусу.
Код для сортування за статусами
Відкрийте файл catalog/model/catalog/product.php та знайдіть функцію getProducts. Вона відповідає за формування SQL-запиту для вибірки товарів. Додайте наступний код:
$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-запиту.
Код для сортування за кількістю
Додайте наступне до вашого запиту:
$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 або залишити коментар у нашому блозі.

