КАРТОЧКА ТОВАРА / Калькулятор в карточке товара для делимых продуктов

Заметка создана: 19 марта 2024 г.
Этот калькулятор подойдёт для сайтов, где продается товар мерный, цена которого зависит от выбранной площади и толщины материала.
Для начала создаём Информационную систему, которую назовем, к примеру "Материалы для калькулятора". Сразу же создадим Допсвойство "Кратность" (поясню ниже). Далее создадим инфоэлементы для разных толщин материала. Например, "Материал толщина 1.8 мм", "Материал, толщина 2.1мм" и т.д. В свойстве "Кратность" нужно указать на какую величину увеличивается стоимость товара за единицу площади. Т.е. к примеру, для "Материал, толщина 1мм" стоимость квадратного метра 100р., а для "Материал толщина 1.8 мм" - 200 р. Тогда кратность будет равна "2". Эту кратность будем использовать в калькуляторе в карточке товара. Чтобы передать данные из созданной нами Инфосистемы в карточку товара, добавим нижеприведённый код в ТДС Интернет-магазина:
// Материалы в карточке товара
ob_start();
if (Core::moduleIsActive('informationsystem'))
{
	$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(Core_Entity::factory('Informationsystem', 32));

	$Informationsystem_Controller_Show->xsl(Core_Entity::factory('Xsl')->getByName('МатериалыВКарточкеТовараСайт2'))
		->groupsMode('none')
		->itemsForbiddenTags(array('text', 'description'))
		->cache(FALSE)
		->group(FALSE)
		->itemsPropertiesList(FALSE)
		//->itemsProperties(array(129))
		->itemsProperties(TRUE)
		->limit(20)
		//->votes(TRUE)
		->show();
}
$Shop_Controller_Show->addEntity(
	Core::factory('Core_Xml_Entity')
		->name('kratnost')->value(ob_get_clean())
);
//

В итоге, получим в XML данные о Материалах.

В XSL карточки товара добавляем код нашего калькулятора, а в макет код jquery, который будет у нас отслеживать изменения в полях и селекторе и производить расчёт. 

XSL

<div class="calculator mt-4">
<!-- калькулятор площади -->
<form id="form" >
<input type="hidden" name="item-price" value="{price}"/>
<div class="row">
<div class="col-12 col-sm-6 form-group">
<label>Высота сетки, см: </label>
<div class="calc-input-block">
<input id="height" type="number" value="100" step="1" name="height"/>
<span class="qty-wrapper">
<span class="qty-inner">
<span class="qty-up" data-src="#height" title="+">+</span>
<span class="qty-down" data-src="#height" title="-">-</span>
</span>
</span>
</div>
</div>
<div class="col-12 col-sm-6 form-group">
<label>Длина сетки, см: </label>
<div class="calc-input-block">
<input id="width" type="number" value="100" step="1" name="width" />
<span class="qty-wrapper">
<span class="qty-inner">
<span class="qty-up" data-src="#width" title="+">+</span>
<span class="qty-down" data-src="#width" title="-">-</span>
</span>
</span>
</div>
</div>
</div>
<xsl:if test="/shop/kratnost">
<div class="form-group">
<xsl:value-of disable-output-escaping="yes" select="/shop/kratnost "/>
</div>
</xsl:if>
<!--Цена-->
<div class="item-price">
<div> Цена: </div>
<span id="summ"><xsl:value-of select="format-number(price, '### ##0', 'my')"/></span><xsl:text> </xsl:text><span><xsl:value-of select="currency"/></span>
</div>
<input id="quantity" type="hidden" value="1" name="quantity" />
</form>
<!--div class="margin-top-10 margin-bottom-10">
<div class="small"><xsl:value-of disable-output-escaping="yes" select="/shop/sales "/></div>
</div-->
<div class="list-btn mt-3">
<button id="fast_order" class="btn btn-secondary btn-lg in-cart" data-item-id="{@id}" onclick="return $.oneStepCheckout('{/shop/url}cart/', $(this).data('item-id'), $('#quantity').val())" type="button" title="Заказать" data-height="100" data-width="100" data-materials="Фотосетка 1,8 мм" data-toggle="modal" data-target="#oneStepCheckout{@id}">
<svg viewBox="0 0 576 512" width="16px" height="16px"><path class="white" d="M564.907 196.35L388.91 12.366C364.216-13.45 320 3.746 320 40.016v88.154C154.548 130.155 0 160.103 0 331.19c0 94.98 55.84 150.231 89.13 174.571 24.233 17.722 58.021-4.992 49.68-34.51C100.937 336.887 165.575 321.972 320 320.16V408c0 36.239 44.19 53.494 68.91 27.65l175.998-184c14.79-15.47 14.79-39.83-.001-55.3zm-23.127 33.18l-176 184c-4.933 5.16-13.78 1.73-13.78-5.53V288c-171.396 0-295.313 9.707-243.98 191.7C72 453.36 32 405.59 32 331.19 32 171.18 194.886 160 352 160V40c0-7.262 8.851-10.69 13.78-5.53l176 184a7.978 7.978 0 0 1 0 11.06z"/></svg>
<span>Заказать</span></button>
</div>
</div>

JavaScript / jQuery

// Cart quantity
$(".qty-inner .qty-up").on("click", function() {
var jInput = $($(this).data('src')),
oldValue = jInput.val();
var jInputName = $(jInput).attr('name');
console.log(jInputName);
if (jInputName =='height' || jInputName =='width') {
    if (oldValue < 100) {
      jInput.val(100);  
    } 
    else if (jInputName =='height' && oldValue < 300 && oldValue > 99) {
         jInput.val(parseInt(oldValue) + 1);
    }
    else if (jInputName =='width' && oldValue > 99) {
         jInput.val(parseInt(oldValue) + 1);
    }
}
else if(jInputName =='height2' || jInputName =='width2') {
    if (jInputName =='height2' && oldValue < 158) {
        jInput.val(158);
     }
    else if (jInputName =='width2' && oldValue < 100) {
        jInput.val(100);
     }
    else if (jInputName =='width2' && oldValue > 99) {
         jInput.val(parseInt(oldValue) + 100);
    }
}
var price = $('input[name=item-price]').val() * 1;
var height = $('input[name=height]').val() * 1; 
var width = $('input[name=width]').val() * 1; 
var height2 = $('input[name=height2]').val() * 1; 
var width2 = $('input[name=width2]').val() * 1; 
var material = $('#materials').val(); 
var materialName = $('#materials option:selected').text(); 
var result = ((height * width * material)/10000).toFixed(2); 
var result2 = ((width2 * material)/100).toFixed(2);
var summ = (result * price).toFixed(0);
var summ2 = (result2 * price).toFixed(0);
$('#summ').html(summ); // записываем сумму
$('#summ2').html(summ2); // записываем сумму
        $('#quantity').val(result); // записываем количество
        $('#quantity2').val(result2); // записываем количество
        if (jInputName =='width2') {
                $('#fast_order').data('height', height2 ).data('width', width2 ).data('materials', materialName );
                $('#inCart').data('height', height2 ).data('width', width2 ).data('materials', materialName );
        }else{
                $('#fast_order').data('height', height ).data('width', width ).data('materials', materialName );
                $('#inCart').data('height', height ).data('width', width ).data('materials', materialName );
        }
});
$(".qty-inner .qty-down").on("click", function() {
var jInput = $($(this).data('src')),
oldValue = jInput.val();
var jInputName = $(jInput).attr('name');
if (jInputName =='width2') {
       if (oldValue > 199) {
       jInput.val(parseInt(oldValue) - 100);
  }
}
else if (oldValue < 299 && oldValue > 100) {
jInput.val(parseInt(oldValue) - 1);
}
var price = $('input[name=item-price]').val() * 1;
var height = $('input[name=height]').val() * 1; 
 var width = $('input[name=width]').val() * 1;
var material = $('#materials').val(); 
var materialName = $('#materials option:selected').text(); 
var result = ((height * width * material)/10000).toFixed(2); 
var summ = (result * price).toFixed(0);
$('#summ').html(summ); // записываем сумму
$('#quantity').val(result); // записываем количество
$('#fast_order').data('height', height ).data('width', width ).data('materials', materialName ); // Отправляем информацию о размерах в быстрый заказ
});
$('#height, #width').on("change keyup paste", function(){
var price = $('input[name=item-price]').val() * 1;
var height = $('input[name=height]').val() * 1; 
var width = $('input[name=width]').val() * 1; 
var material = $('#materials').val(); 
var materialName = $('#materials option:selected').text(); 
var result = ((height * width * material)/10000).toFixed(2); 
var summ = (result * price).toFixed(0);
$('#summ').html(summ); // записываем сумму
$('#quantity').val(result); // записываем количество
$('#fast_order').data('height', height ).data('width', width ).data('materials', materialName );
});
$("#form #materials").change(function(){
var price = $('input[name=item-price]').val() * 1;
var height = $('input[name=height]').val() * 1; 
var width = $('input[name=width]').val() * 1; 
var material = $(this).val(); 
var materialName = $('#materials option:selected').text(); 
var result = (((height * width) * material)/10000).toFixed(2); 
var summ = (result * price).toFixed(0);
$('#summ').html(summ); // записываем сумму
        $('#quantity').val(result); // записываем количество
        $('#fast_order').data('height', height ).data('width', width ).data('materials', materialName );
});