Автор Тема: Меняем дополнительные параметры с селекта на чекбоксы  (Прочитано 3222 раз)

milukove

  • Гость
Долго искал решения для замены вывода доп параметров товара, с селекта на чекбоксы. Мне нужна была возможность отметить несколько пунктов одного параметра. Так как ничего в инете не нашел, но видел, что люди тоже задавались этим вопросом решил выложить свое решение. Просьба не кидать помидорами, понимаю, что наверно можно лучше и проще, но на что хватило знаний, то и сделал. Возможно кого-то это натолкнет на мысль как реализовать все это "по уму".

Во первых так как у нас будут 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
         {
         
В общем то и все, оказалось совсем не сложно, и кажется работает, хотя на реальном проекте еще не тестил. Буду рад если смог кому-то помочь.