Сортировка вариантов товара по наличию

Правила раздела: faq.php?mode=okay

makki
makki
Репутация: 139
Сообщения: 396
Зарегистрирован: 12.08.2016
С нами: 2 года 7 месяцев
Откуда: Киев
Сайт Skype

Сообщение #1 makki » 09.01.2019, 09:10

Сортировка вариантов товара в клиенской части всюду,где показаны варианты

1) Файл api/Variants.php
1.1.) В функции get_variants после

Код: Выделить всё

$instock_filter = '';

добавим

Код: Выделить всё

$order = 'v.position, v.id';
if(!empty($filter['sort_stock'])) {
            $order = 'stock DESC, '.$order;
        }

1.2) В той же функции ниже в SQL запросе вместо

Код: Выделить всё

ORDER BY v.position, v.id

пишем

Код: Выделить всё

ORDER BY $order

2) Файл view/ProductView.php
Вместо

Код: Выделить всё

foreach($this->variants->get_variants(array('product_id'=>$product->id)) as $v) {
            $variants[$v->id] = $v;
        }

пишем

Код: Выделить всё

foreach($this->variants->get_variants(array('product_id'=>$product->id, 'sort_stock'=>1)) as $v) {
            $variants[$v->id] = $v;
        }

3) Файл view/ProductsView.php
Вместо

Код: Выделить всё

$variants = $this->variants->get_variants(array('product_id'=>$products_ids));

пишем

Код: Выделить всё

$variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'sort_stock'=>1));

4) В файле view/BlogView.php
вместо

Код: Выделить всё

$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products)));

пишем

Код: Выделить всё

$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'sort_stock'=>1));

5) В файле view/WishlistView.php
Вместо

Код: Выделить всё

foreach ($this->variants->get_variants(array('product_id' => $products_ids)) as $variant) {

пишем

Код: Выделить всё

foreach ($this->variants->get_variants(array('product_id' => $products_ids, 'sort_stock'=>1)) as $variant) {

6) Убираем уже ненужный нам код из design/ВАШ_ШАБЛОН/html/scripts.tpl

Код: Выделить всё

{if $smarty.get.module == "MainView" || $smarty.get.module == "ProductsView" || $smarty.get.module == "ProductView" || $smarty.get.module == "ComparisonView" || $smarty.get.module == "WishlistView" || $smarty.get.module == "BlogView"}
        $(document).ready(function(){
            $('select[name=variant]').each(function(){
                var first_in_stock = $(this).find('option[data-stock!="0"]').first();
                first_in_stock.prop('selected',true);
                first_in_stock.trigger('change');
            });
        });
    {/if}
Последний раз редактировалось makki 09.01.2019, 12:29, всего редактировалось 1 раз.
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

korshunov
korshunov
Репутация: 93
Сообщения: 927
Зарегистрирован: 03.12.2015
С нами: 3 года 3 месяца
Skype

Сообщение #2 korshunov » 09.01.2019, 10:24

По-моему, это неправильно работает, когда stock имеет значения NULL.

Надо бы первое изменение делать иначе, например, так:
$order = '(v.stock is null) DESC, v.stock DESC, '.$order;

makki
makki
Репутация: 139
Сообщения: 396
Зарегистрирован: 12.08.2016
С нами: 2 года 7 месяцев
Откуда: Киев
Сайт Skype

Сообщение #3 makki » 09.01.2019, 12:30

korshunov писал(а):По-моему, это неправильно работает, когда stock имеет значения NULL.

Надо бы первое изменение делать иначе, например, так:
$order = '(v.stock is null) DESC, v.stock DESC, '.$order;
Спасибо. Исправил в изначальном сообщении, но немного по-другому.
Вместо

Код: Выделить всё

$order = 'v.stock DESC, '.$order;

написал

Код: Выделить всё

$order = 'stock DESC, '.$order;


Кому нужно поместить сначала вариант с наличием на складе > 0, потом пустые (знак бесконесности), потом наличе = 0, сортировка будет выглядеть так:

Код: Выделить всё

$order = 'IF(v.stock = 0,1,0), v.stock IS NULL, v.stock DESC, '.$order;

Можно и без v.stock IS NULL, но на некоторых версиях MySQL будет неправильный результат.
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS


Название раздела: Полезные решения для OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Полезные решения для OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость