Произвольная цена в корзине Битрикс

Это невозможно! — сказал Гугл.
Это безумство! — сказала техподдержка.
Не, ну... — сказал программист и достал свой бубен.

Порой, для реализации поставленной задачи, средств Битрикса оказывается недостаточно. Например. Нам нужно вывести цену на основе введенных пользователем данных. Теоретически можно создать миллион торговых предложений, одно из которых, возможно и подойдет пользователю. Но например мы продаем лист фанеры произвольной длины и ширины. В миллиметрах. Можно прикинуть, сколько надо создать торговых предложений, чтобы покрыть весь спектр размеров, так сказать. Но выход есть — алкоголизм написать свой калькулятор и передавать цену в корзину посредством CSaleBasket::Add

Итак задача: Продаем например путёвки. Цена должна строиться так: ((количество взрослых мест * цена взрослого места) + (количество детских мест1 * цена детского места1 + количество детских мест2 * цена детского места2 + ...)) * количество дней. В шаблоне карточки товара пишем калькулятор:

	$('li[data-onevalue]').removeClass('bx_active');

	var data;
	var dayNums;
	var date1 = $("#date1").val();
		date1 = new Date(date1);
		date1 = Date.parse(date1);
	var date2 = $('#date2').val();
		date2 = new Date(date2);
		date2 = Date.parse(date2);

	function calculate(data){
		var price = 0;
		$.each($('.sku-block[data-skuid="' + data + '"] input'), function (index, input) {
			dayNums = (date2 - date1) / 1000 / 60 / 60 / 24;
			var count = parseInt($(input).val());
			var input_price = parseInt($(input).data('price'));

			price += input_price * count * dayNums;
		});

		adultNumber = $('.sku-block[data-skuid="' + data + '"] #adult-number').val();
		childNumber = 0;
		$.each($('.sku-block[data-skuid="' + data + '"] .child-number'), function (index, input) {
			childNumber = childNumber+parseInt($(input).val());
		});

		$('#price_id').html(price);
		$('#finalPrice').val(price);
	}

	$('li[data-onevalue]').click(function () {
	$('*.sku-block').hide();
	data = $(this).data('onevalue');
	$('.sku-block[data-skuid="' + data + '"]').show();
	numType = $('li[data-onevalue="'+data+'"] .cnt').html();

	calculate(data);
	});

	$('.input_class').change(function(){
		calculate(data);
	});

	$('#date1').change(function(){
		date1 = $("#date1").val();
		date1 = new Date(date1);
		date1 = Date.parse(date1);
		calculate(data);
	});
	$('#date2').change(function(){
		date2 = $('#date2').val();
		date2 = new Date(date2);
		date2 = Date.parse(date2);
		calculate(data);
	});

Соответственно #date1, #date2, .input_class — это наши инпуты, с которых собираем данные для калькулятора. Посчитанную цену пишем в #price_id и #finalPrice.

Собираем все получившиеся данные

    var shop = {};

    $(function(){ 

		var shop = {};

		// Добавление товаров в корзину
                var elm = document.getElementsByClassName('.addToCart');
		$(".addToCart").click(function (e) {

			// ID товара
			shop.id = $('#shopId').val();

			// Базовая цена товара
			shop.finalPrice = $('#finalPrice').val();

			//Дата заезда
			shop.date1 = $("#date1").val();

			//Дата отъезда
			shop.date2 = $("#date2").val();

			//Тип номера
			shop.numType = numType;

			//Количество взрослых номеров
			shop.adultNumber = adultNumber;

			//Количество детских номеров
			shop.childNumber = childNumber;
            // Базовые данные
            var sendData = {
                id: shop.id,
                price: shop.finalPrice,
				date1: shop.date1,
				date2: shop.date2,
				numType: shop.numType,
				adultNumber: shop.adultNumber,
				childNumber: shop.childNumber,
                value: 1,
            };

и отправляем аяксом в addToCart.php

                this.blur();
                var link = $(this).attr('href').match(/\?.*$/);

                $.ajax({
					url: "/local/templates/.default/addToCart.php",
					global: false,
					type: "POST",
					data: ({sendData : sendData}),
					type: 'POST',
					success: function(data){
                     alert('Товар добавлен в корзину');
                  }
                }).done(function( msg ) {
					//alert( "Data Saved: " + msg );
					document.location.href="/personal/basket.php";
					});
                return false;
              });

addToCart.php:

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt");
AddMessage2Log($_POST);
//print_r($_POST);
if (CModule::IncludeModule("sale"))
{
if(CModule::IncludeModule("iblock")){
$arSelect = Array("", "NAME", "DETAIL_PAGE_URL");
$arFilter = Array("IBLOCK_ID"=>"3", "ID"=>$_POST["sendData"]["id"]);
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->GetNextElement())
{
  $element = $ob->GetFields();
}
}
  $arFields = array(
    "PRODUCT_ID" => $_POST["sendData"]["id"],
    "PRICE" => $_POST["sendData"]["price"],
    "QUANTITY" => 1,
    "LID" => LANG,
    "CAN_BUY" => "Y",
    "CURRENCY" => "RUB",
    "NAME" => $element["NAME"],
    "CALLBACK_FUNC" => "",
    "MODULE" => "",
    "NOTES" => "",
    "ORDER_CALLBACK_FUNC" => "",
    "DETAIL_PAGE_URL" => $element["DETAIL_PAGE_URL"],
  );

    $arProps = array();
	  if(isset($_POST["sendData"]["date1"])):
	  $arProps[0] = array(
		"NAME" => "Дата заезда",
		"CODE" => "DATE1",
		"VALUE" => $_POST["sendData"]["date1"],
	  );
	  $arProps[1] = array(
		"NAME" => "Дата отъезда",
		"CODE" => "DATE2",
		"VALUE" => $_POST["sendData"]["date2"],
	  );
	  $arProps[2] = array(
		"NAME" => "Тип номера",
		"CODE" => "NUM_TYPE",
		"VALUE" => $_POST["sendData"]["numType"],
	  );
	  $arProps[3] = array(
		"NAME" => "Взрослых мест",
		"CODE" => "ADULT_NUMBER",
		"VALUE" => $_POST["sendData"]["adultNumber"],
	  );
	  $arProps[4] = array(
		"NAME" => "Детских мест",
		"CODE" => "CHILD_NUMBER",
		"VALUE" => $_POST["sendData"]["childNumber"],
	  );
	  endif;

	$arFields["PROPS"] = $arProps;

	print_r($arFields);
  CSaleBasket::Add($arFields);
}
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>

Вы великолепны! В корзину и соответственно в заказ добавилась ваша скалькулированная цена, вместо цены из торгового предложения. Плюс бонусом туда отправилась информация о дате заезда/отъезда, количестве взрослых и детей.

Не спорю, код не изящный, но рабочий. Проверенно. Да, пока тут не работают ссылки и всякие плюшки, но в качестве идеи — милости прошу пользоваться.

2 thoughts on “Произвольная цена в корзине Битрикс”

Добавить комментарий