У системі 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 або залишити коментар у нашому блозі.