Блог

Несколько единиц измерения для одного элемента (товара)

Пользователю предоставлена возможность менять «на ходу» единицы измерения. Как вариант – керамическая (кафельная) плитка, может быть измерена квадратными метрами, штуками и коробками. В карточке товара админка битрикса дает возможность установить в качестве единицы измерения только одну из величин, остальные величины дописали как свойства элемента инфоблока. Привязку сделали по части символьного кода, название свойства служит заголовком для альтернативной единицы измерения, в значении свойства храниться коэффициент. Код JS битрикса не модифицировался, на кнопки «добавить», «уменьшить» дописали свои JS, которые пересчитывают, значения для соответствующих инпутов альтернативных единиц измерения. В целом стандартный функционал битрикса не модифицирован, пользователь получает дополнительную удобную возможность на front-end видеть нужную инфу. Не реализовано здесь – проверка ввода значения в дополнительные инпуты «руками» на соответствие коэффициентам (у битрикса такая проверка работает).

PHP (переключатель единиц измерения)
                                <div class="tap-block-title">
                                    <a id="a_0_<?=$item[ID]?>" class="togle_measure_<?=$item[ID]?> active" href="javascript:void(0)"><?=$item[ITEM_MEASURE][TITLE]?></a>
                                    <? foreach ($item[PROPERTIES] as $keyProp => $arMeasure):
                                       if (substr($keyProp,0,7)=='MEASURE'&&!empty($arMeasure[VALUE])):
                                 echo '<a class="togle_measure_'.$item[ID].'" href="javascript:void(0)" data-measure="'.$arMeasure[VALUE].'" id="a_'.$arMeasure[ID].'_'.$item[ID].'">'.$arMeasure[NAME].'</a>';
                              endif;
                                    endforeach;?>
                                </div>
 
PHP (инпуты для количества)
                                    <div class="count">
                                       <input id="<?=$itemIds['QUANTITY']?>" type="tel"
                                 name="<?=$arParams['PRODUCT_QUANTITY_VARIABLE']?>"
                                 value="<?=$measureRatio?>">
                                    <? foreach ($item[PROPERTIES] as $keyProp => $arMeasure):
                                       if (substr($keyProp,0,7)=='MEASURE'&&!empty($arMeasure[VALUE])):
                                 echo '<input value="'.$arMeasure[VALUE].'" type="text" name="quantity" id="i_'.$arMeasure[ID].'_'.$item[ID].'" style="display: none;">';
                              endif;
                                    endforeach;?>
                                        <div class="u-arrow">
                                            <div class="arrow-up plus" id="<?=$itemIds['QUANTITY_UP']?>" href="javascript:void(0)" rel="nofollow"></div>
                                            <div class="arrow-down minus" id="<?=$itemIds['QUANTITY_DOWN']?>" href="javascript:void(0)" rel="nofollow"></div>
                                        </div>
                                    </div>
 
JS
   $('.togle_measure_<?=$item[ID]?>').click(function(){
      var inpTog = this.id.replace('a','i');
      var arrInp = inpTog.split('_')
      $(this).siblings('a').removeClass('active');
      $(this).addClass('active');
      if (arrInp[1]>0){
         $('#'+this.id.replace('a','i')).parent('.count').find('input').attr('style','display:none;');
         $('#'+this.id.replace('a','i')).removeAttr('style');
      }
      else{
         $(this).parent().parent().parent().find('input').attr('style','display:none;');
         $('#'+$(this).parent().parent().parent().find('input')[0].id).removeAttr('style');
      }
   });
   $('#<?=$itemIds['QUANTITY_UP']?>').click(function(){
      var arrInput = $(this).parent().parent('.count').find('input');
      var curVal = 0;
      var incVal = 0;
      for (i=1; i<arrInput.length; i++){
         curVal = parseFloat(arrInput[i].value);
         incVal = parseFloat($('#'+arrInput[i].id.replace('i','a')).attr('data-measure'));
         arrInput[i].value=curVal+incVal;
      }
   });
   $('#<?=$itemIds['QUANTITY_DOWN']?>').click(function(){
      var arrInput = $(this).parent().parent().find('input');
      var curVal = 0;
      var incVal = 0;
      for (i=1; i<arrInput.length; i++){
         curVal = parseFloat(arrInput[i].value);
         incVal = parseFloat($('#'+arrInput[i].id.replace('i','a')).attr('data-measure'));
         if (curVal-incVal>0) arrInput[i].value=curVal-incVal;
      }
   });
 
52073f0284f117d5f06345846f0f2c92.jpg
0
Bulat
24.08.2017 09:22:51
Единицы измерения
А есть ли возможность использовать несколько единиц измерения одновременно?
Т.Е. можно ли в корзину добавить 1 товар скажем 6 штук по 8 килограмм. Чтобы во фронт энде пользователь сам выбирал объем/длинну/площадь и т.п. и количество таких товаров.
Например: "хочу 10 палок по 5 метров"
Ответить Ссылка 0
0
28.08.2017 17:29:39
К вопросу о корзине
В принципе на этом же примере реализована и корзина с теми же единицами:ee62df4048230672f195c963bcd7f5b9.jpg
Если Вам нужно именно это. Если же Вы хотите давать возможность пользователю в каталоге менять единицы измерения для приобретения товара это можно реализовать торговыми предложениями (ТП) для каждого типа единиц измерения одного товара, т.е. завести палки штуками и палки метрами, для каждого ТП своя цена и своя кратность.
Ответить Родитель Ссылка 0