Legosp Forum
Shop-Script "Legosp" => Разработка => Тема начата: milukove от Августа 17, 2012, 01:14:35 pm
-
Долго искал решения для замены вывода доп параметров товара, с селекта на чекбоксы. Мне нужна была возможность отметить несколько пунктов одного параметра. Так как ничего в инете не нашел, но видел, что люди тоже задавались этим вопросом решил выложить свое решение. Просьба не кидать помидорами, понимаю, что наверно можно лучше и проще, но на что хватило знаний, то и сделал. Возможно кого-то это натолкнет на мысль как реализовать все это "по уму".
Во первых так как у нас будут input вместо select, каждому input надо дать свой id.
Я решал это так: моифицируем кусок кода вывода доп. опций
файл product_brief.tpl.html
{foreach from=$options[$id] item=option key=key name=option}
<tr>
<td style="vertical-align: top">
<b>{$option.name}:</b><br />
{if count($option.var)>1}
{assign var="i" value=$i+1}
{foreach from=$option.var item=var}
<!-- переменная $eg подставляется к id input, увеличиваясь на 1 с каждым следующим input -->
{assign var="eg" value=$eg+1}
<!-- ставим вместо select - checkbox, подставляем в него параметры класса, значения, имени и тп из select. Не забываем событие onChange. -->
<input id="product_option[{$id}][{$eg}]" type="checkbox" class="product_option_{$id}" name="product_option_{$id}_{$key}" onChange="GetNewPrice({$id},{$i})" {if $var.default} {math assign="p" equation="x+z" x=$var.price_surplus z=$p format="%.2f"} {/if} rel="0" value="{$var.variantID}:{$var.price_surplus}:{$var.picture}" /> {$var.name}{if $var.price_surplus!=0} {assign var="new_price" value="1"} ({if $var.price_surplus>0}+{/if}{math equation="x/y" x=$var.price_surplus y=$smarty.const.CURRENCY_val format="%.2f"}){/if}<br />
{/foreach}
{elseif $option.or_op}
{$option.or_op}
{else}
{$option.var.0.name}
{/if}
<br>
</td>
</tr>
{/foreach}
Теперь поменяем динамическое изменение получившейся с опциями цены:
файл js.tpl.html
function GetNewPrice(id,oid)
{
spriceid='#sprice'+id;
imgid='#simg'+id;
snewpic=$(imgid).val();
summ=Math.round($(spriceid).val()*100)/100;
product_option_Class="product_option_"+id;
product_option_id="product_option["+id+"]";
// не помню менял ли тут, если тут выборка по id, меняем ее на выборку по классу
var array_po=getElementsByClass(product_option_Class);
for (var oi=0; oi<array_po.length; oi++)
{
product_option_id_i=product_option_id+"["+(oi+1)+"]";
// а тут ставим условие прибавлять к сумме только checked
if (document.getElementById(product_option_id_i).checked){
ps=document.getElementById(product_option_id_i).value.split(':')[1];
if (!ps) ps=0;
summ +=Math.round(ps*100)/100;
}
}
product_option_id="product_option["+id+"]["+oid+"]";
if (document.getElementById(product_option_id).value.split(':')[2])
{
snewpic=pct+'-S.jpg';
idsel='./products_pictures/'+snewpic;
document.getElementById('dp'+id).src=idsel;
}
vpriceid='#vnewprice'+id;
{/literal}
cur={$smarty.const.CURRENCY_val};
{literal}
cur=Math.round(cur*1000)/1000;
summ=Math.round(summ/cur*100)/100;
$(vpriceid).html(currencyFormat(summ,0.01));
//меняем значение в hidden input с новой ценой
e2priceid='#newprice'+id;
$(e2priceid).val(currencyFormat(summ,0.01));
}
Меняем принцип записи опций в сессию.
Для этого модифицируем формируемый javascript-ом запрос передаваемый аяксом:
файл js_script.js
// ставим выборку по отмеченным чекбоксам
var array_options = $('.product_option_'+curid+':checked');
for (var oi=0; oi<array_options.length; oi++)
{
if ((array_options[oi].name.split('_')[2])==curid)
{
if (oi==0)
option= array_options[oi].name.split('_')[3] +':'+array_options[oi].value.split(':')[0];
else option= option +',' + array_options[oi].name.split('_')[3] +':'+array_options[oi].value.split(':')[0];
}
}
Теперь мы получили возможность каждый отмеченный в доп. опциях пункт записывать как отдельный доп.
Лично для моих нужд не важно было кол-во товаров, поэтому я убрал проверку наличия в корзине, и теперь каждый товар добавляется отдельным пунктом
файл shopping_cart.php
Убираем кусок:
if ($i < count($_SESSION["gids"])) //increase current product's quantity
{
if (!CONF_SHOW_ADD2CART_INSTOCK) if (($is-$_SESSION["counts"][$i]-$pcount)<0) {echo "-1"; return 0;}
$_SESSION["counts"][$i]+=$pcount;
}
else //no item - add it to $gids array
{
В общем то и все, оказалось совсем не сложно, и кажется работает, хотя на реальном проекте еще не тестил. Буду рад если смог кому-то помочь.