?variant=

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

BAG
BAG

Сообщение #1 BAG » 31.05.2018, 21:26

Добрый день.
При переходе на вариант товара по ссылке ?variant=, например: http://demookay.com/products/telefon-meizu-m3-mini-m688u-16-gb?variant=24
jQuery переопределяет выбор варианта на ПЕРВЫЙ вариант В НАЛИЧИИ.
Возможно проще выбирать вариант по умолчанию не через jQuery, а изменить вариант по умолчанию в ProductView.php.
Например сделать сортировку если варианта нет в наличии опустить его ниже варианта который в наличии.

BAG
BAG

Сообщение #2 BAG » 02.06.2018, 05:44

Сам исправил.. Добавил в скрипт проверку условия: ЕСЛИ есть в наличии и отмечен ТО ничего не делать, ИНАЧЕ найти первый в наличии и отметить.

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #3 makki » 02.06.2018, 18:45

BAG писал(а):Добрый день.
При переходе на вариант товара по ссылке ?variant=, например: http://demookay.com/products/telefon-meizu-m3-mini-m688u-16-gb?variant=24
jQuery переопределяет выбор варианта на ПЕРВЫЙ вариант В НАЛИЧИИ.
Это переопределение через jQuery работает не во всех браузерах. Например в Сафари не работает.
Чтобы это исправить нужно в scripts.tpl в этом коде заменить first_in_stock.attr('selected',true); на first_in_stock.prop('selected',true);

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

    {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.attr('selected',true);
                first_in_stock.trigger('change');
            });
        });
    {/if}


Тоже считаю, что, определение варианта по-умолчанию нужно делать на стороне сервера.
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #4 makki » 13.08.2018, 14:27

Еще раз сегодня убедился, что вышеуказанный кусок кода из scripts.tpl - это зло, которое нужно срочно искоренить из движка.
Зачем в каталоге товаров дергать 24 селекта и 24 раза запускать $(document).on('change', '.fn_variant', function(), в которой тысяча операций? А что если выставлено 50 товаров на странице сайта?
И все это ради того чтобы определить вариант товара по-умолчанию у которого наличие больше ноля.
Не лучше ли это сделать в том же ProductsView.php, в котором итак зачем-то назначается вариантом по-умолчанию первый вариант товара.

Предлагаю разработчикам обратить внимание на этот момент и оптимизировать Okay
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #5 makki » 11.01.2019, 09:39

Уважаемые разработчики уберите пожалуйста этот код из 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.attr('selected',true);
                first_in_stock.trigger('change');
            });
        });
    {/if}

Фактически в каждой доработке, которая имеет дело с вариантами товара, приходится это делать.
Вот готовые исправления.
1) view/ProductsView.php
Добавить

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

foreach($product->variants as $v) {
                        if($v->stock) {
                            $product->variant = $v;
                            break;
                        }
                    }

после строк

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

foreach($products as $product) {
                if(isset($product->variants[0])) {
                    $product->variant = $product->variants[0];

2) view/ProductView.php
Добавить

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

foreach($variants as $v) {
                        if($v->stock) {
                            $product->variant = $v;
                            break;
                        }
                    }

после строк

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

if(($v_id = $this->request->get('variant', 'integer'))>0 && isset($variants[$v_id])) {
            $product->variant = $variants[$v_id];
        } else {
            $product->variant = reset($variants);

3) view/View.php
Добавить такой код

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

foreach($product->variants as $v) {
                        if($v->stock) {
                            $product->variant = $v;
                            break;
                        }
                    }

в 3-х местах после строк

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

foreach($products as $product) {
                    if(isset($product->variants[0])) {
                        $product->variant = $product->variants[0];

4) design/okay_shop/html/product.tpl
добавить {if $v->id == $product->variant->id} selected{/if} в строке

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

<option value="{$v->id}" data-price="{$v->price|convert}" data-stock="{$v->stock}"{if $v->compare_price > 0} data-cprice="{$v->compare_price|convert}"{/if}{if $v->sku} data-sku="{$v->sku|escape}"{/if} {if $v->units}data-units="{$v->units}"{/if}>{if $v->name}{$v->name|escape}{else}{$product->name|escape}{/if}</option>

чтобы получилось

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

<option value="{$v->id}" data-price="{$v->price|convert}" data-stock="{$v->stock}"{if $v->compare_price > 0} data-cprice="{$v->compare_price|convert}"{/if}{if $v->sku} data-sku="{$v->sku|escape}"{/if} {if $v->units}data-units="{$v->units}"{/if}{if $v->id == $product->variant->id} selected{/if}>{if $v->name}{$v->name|escape}{else}{$product->name|escape}{/if}</option>


5) design/okay_shop/html/product_list.tpl
добавить {if $v->id == $product->variant->id} selected{/if} в строке

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

<option value="{$v->id}" data-price="{$v->price|convert}" data-stock="{$v->stock}"{if $v->compare_price > 0} data-cprice="{$v->compare_price|convert}"{/if}{if $v->sku} data-sku="{$v->sku|escape}"{/if}>{if $v->name}{$v->name|escape}{else}{$product->name|escape}{/if}</option>

чтобы получилось

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

<option value="{$v->id}" data-price="{$v->price|convert}" data-stock="{$v->stock}"{if $v->compare_price > 0} data-cprice="{$v->compare_price|convert}"{/if}{if $v->sku} data-sku="{$v->sku|escape}"{/if}{if $v->id == $product->variant->id} selected{/if}>{if $v->name}{$v->name|escape}{else}{$product->name|escape}{/if}</option>
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

OkayCMS M
Администратор
Аватара
OkayCMS M
Администратор
Репутация: 216
Сообщения: 1627
Зарегистрирован: 12.11.2015
С нами: 8 лет 4 месяца
Сайт Skype

Сообщение #6 OkayCMS » 11.01.2019, 15:11

Уже реализовали в будущей версии, но сделали немного по другому.
Сделано следующее: на фронте все варианты каждого товара условно делятся на две группы, в наличии и нет. сразу у товара выводятся все варианты в наличии которые друг относительно друга расположены как в админке, затем все не в наличии выводятся в такой же последовательности. Выбран у товара всегда первый вариант, т.к. это либо вариант в наличии, либо у товара все варианты не в наличии.

OkayCMS M
Администратор
Аватара
OkayCMS M
Администратор
Репутация: 216
Сообщения: 1627
Зарегистрирован: 12.11.2015
С нами: 8 лет 4 месяца
Сайт Skype

Сообщение #7 OkayCMS » 25.01.2019, 13:55

Выпустили OkayCMS 2.3.0 где это реализовано https://okay-cms.com/article/vyshla-okaycms-230


Название раздела: Баг-репорт OkayCMS (Сообщения об ошибках)
Правила раздела: faq.php?mode=okay

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


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

   

Вернуться в «Баг-репорт OkayCMS (Сообщения об ошибках)»

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

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