Страница 1 из 1
?variant=
Добавлено: 31.05.2018, 21:26
BAG
Добрый день.
При переходе на вариант товара по ссылке ?variant=, например:
http://demookay.com/products/telefon-meizu-m3-mini-m688u-16-gb?variant=24jQuery переопределяет выбор варианта на ПЕРВЫЙ вариант В НАЛИЧИИ.
Возможно проще выбирать вариант по умолчанию не через jQuery, а изменить вариант по умолчанию в ProductView.php.
Например сделать сортировку если варианта нет в наличии опустить его ниже варианта который в наличии.
Добавлено: 02.06.2018, 05:44
BAG
Сам исправил.. Добавил в скрипт проверку условия: ЕСЛИ есть в наличии и отмечен ТО ничего не делать, ИНАЧЕ найти первый в наличии и отметить.
Добавлено: 02.06.2018, 18:45
makki
Это переопределение через 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}
Тоже считаю, что, определение варианта по-умолчанию нужно делать на стороне сервера.
Добавлено: 13.08.2018, 14:27
makki
Еще раз сегодня убедился, что вышеуказанный кусок кода из scripts.tpl - это зло, которое нужно срочно искоренить из движка.
Зачем в каталоге товаров дергать 24 селекта и 24 раза запускать $(document).on('change', '.fn_variant', function(), в которой тысяча операций? А что если выставлено 50 товаров на странице сайта?
И все это ради того чтобы определить вариант товара по-умолчанию у которого наличие больше ноля.
Не лучше ли это сделать в том же ProductsView.php, в котором итак зачем-то назначается вариантом по-умолчанию первый вариант товара.
Предлагаю разработчикам обратить внимание на этот момент и оптимизировать Okay
Добавлено: 11.01.2019, 09:39
makki
Уважаемые разработчики уберите пожалуйста этот код из 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>
Добавлено: 11.01.2019, 15:11
OkayCMS
Уже реализовали в будущей версии, но сделали немного по другому.
Сделано следующее: на фронте все варианты каждого товара условно делятся на две группы, в наличии и нет. сразу у товара выводятся все варианты в наличии которые друг относительно друга расположены как в админке, затем все не в наличии выводятся в такой же последовательности. Выбран у товара всегда первый вариант, т.к. это либо вариант в наличии, либо у товара все варианты не в наличии.
Добавлено: 25.01.2019, 13:55
OkayCMS