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

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

Порой, для реализации поставленной задачи, средств Битрикса оказывается недостаточно. Например. Нам нужно вывести цену на основе введенных пользователем данных. Теоретически можно создать миллион торговых предложений, одно из которых, возможно и подойдет пользователю. Но например мы продаем лист фанеры произвольной длины и ширины. В миллиметрах. Можно прикинуть, сколько надо создать торговых предложений, чтобы покрыть весь спектр размеров, так сказать. Но выход есть — алкоголизм написать свой калькулятор и передавать цену в корзину посредством 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");
?>

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

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

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

  1. банковские карты

    Займы онлайн быстрые деньги каждому.

    Как получить.

    Для получения денег необходимо нажать кнопку Получить деньги на этой странице или перейти на онлайн сервис оформления заявки на займ и внимательно заполнить все поля анкеты Внимание.

    Вводите корректные данные и свой номер телефона, на него придет смс с кодом подтверждения .

    При заполнении анкеты укажите сумму займа.

    Предварительный расчет переплаты можно сделать в калькуляторе на главной странице сайта и перейти к заполнению заявки уже из калькулятора, нажав Получить деньги .

    Рекомендуем воспользоваться видеоинструкцией для верного заполнения всех полей.

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

    money-rust.ru — кредитные карты инвестиции herousmoney.ru — миникредит

    5571**

  2. XRumer 19.0 + XEvil 4.0: новая инновационная программа для решения любой капчи

    1. Мощные нейронные сети: XEvil OCR может решить более 12000 различных типов капчи.,

    в том числе такие популярные, как Google ReCaptcha v2, v3 (только в XEvil 4.0 Ultra!), CaptchaCom, SolveMedia, Bing-Captcha,

    Facebook-captcha и Ucoz-captcha, Яндекс-captcha, DLE-captcha, VBulletin-Captcha и много других типов!

    2. Очень высокая скорость и точность: скорость распознавания 0,01 ... 0.02 секунды на изображение (но только 1 секунда в демо-версии!),

    XEvil может обойти и решить широкие типы капчи с высокой точностью,

    без зависимости от сложности, искажений, шумов, шрифтов, цветов.

    Исключение составляет Google ReCaptcha-2, около 20-30 секунд на решение:

    на ReCaptcha-2 нужно нажать много картинок внутри с особой задержкой.

    3. Очень простой интерфейс: всего 3 основные кнопки, чтобы начать распознавание,

    таким образом, он прост в использовании с широким спектром программ SEO, SMM, аналитики, массовой автоматической регистрации, размещения, массовой отправки, парсинга, майнинга криптовалют.

    Интересно? 😉

    Просто сделайте поиск в google «XEvil бесплатно».

    Доступна бесплатная демо-версия!

    Спасибо за внимание! 😉

  3. XRumer 19.0 + XEvil 4.0: новая инновационная программа для решения любой капчи

    1. Мощные нейронные сети: XEvil OCR может решить более 12000 различных типов капчи.,

    в том числе такие популярные, как Google ReCaptcha v2, v3 (только в XEvil 4.0 Ultra!), CaptchaCom, SolveMedia, Bing-Captcha,

    Facebook-captcha и Ucoz-captcha, Яндекс-captcha, DLE-captcha, VBulletin-Captcha и много других типов!

    2. Очень высокая скорость и точность: скорость распознавания 0,01 ... 0.02 секунды на изображение (но только 1 секунда в демо-версии!),

    XEvil может обойти и решить широкие типы капчи с высокой точностью,

    без зависимости от сложности, искажений, шумов, шрифтов, цветов.

    Исключение составляет Google ReCaptcha-2, около 20-30 секунд на решение:

    на ReCaptcha-2 нужно нажать много картинок внутри с особой задержкой.

    3. Очень простой интерфейс: всего 3 основные кнопки, чтобы начать распознавание,

    таким образом, он прост в использовании с широким спектром программ SEO, SMM, аналитики, массовой автоматической регистрации, размещения, массовой отправки, парсинга, майнинга криптовалют.

    Интересно? 😉

    Просто сделайте поиск в google «XEvil бесплатно».

    Доступна бесплатная демо-версия!

    Спасибо за внимание! 😉

    XEvil.net

  4. Long time reader, first time commenter -- so, thought I'd drop a comment...

    — and at the same time ask for a favor.

    Your wordpress site is very simplistic — hope

    you don't mind me asking what theme you're using? (and don't mind if I steal it?

    :P)

    I just launched my small businesses site --also built in wordpress like yours-- but the theme slows (!) the

    site down quite a bit.

    In case you have a minute, you can find it by searching for «royal cbd» on Google (would appreciate any feedback)

    Keep up the good work-- and take care of yourself during the coronavirus scare!

    ~Justin

Добавить комментарий для Justin Hamilton Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *