/ Адаптивность / Способ доставки Деловыми линиями

Способ доставки Деловыми линиями

HIT

Внедряем в пользовательский способ доставки расчет стоимости Деловых линий.

Работа с API Деловые линии

Данный функционал я почерпнул с сайта lospirata.ru, но немного упростил.

Скрипт ajax-обмена данными:

function AjaxFormRequest(result_id, form_id,url) {
	jQuery.ajax({
		url: url,
		type: "POST",
		dataType: "html",
		data: jQuery("#"+form_id).serialize(),
		success: function(response) {
			document.getElementById(result_id).innerHTML = response;
		},
		error: function(response) {
			document.getElementById(result_id).innerHTML = "Ошибка при отправке формы";
		}
	});
}

Форма расчета:

<section id="tzTargetCalc">
	<div id="result_div_id"></div>
	<form id="tzFormCalc" action="" method="post">
	
		<h3>Город доставки</h3>
		<p><label for="moscow">Откуда</label> <input name="moscow" type="text" id="moscow" value="Москва" disabled /></p>
		<p><label for="city">Куда</label> <input name="city" type="text" id="city" list="datalist" placeholder="Населенный пункт" autocomplete="off" /></p>
		<datalist id="datalist">
		<!--[if IE]><select><!--<![endif]-->
		<option>Ангарск</option>
		<option>Курск</option>
		<!--[if IE]></select><!--<![endif]-->
		</datalist>

		<p><input id="home" name="home" type="checkbox" /> <label for="home">До адреса?</label></p>
		
		<h3>Количество слонов</h3>
		<p><label>Синих слонов</label> <input min="0" name="blue" type="number" placeholder="шт" /></p>
		<p><label>Зеленых слонов</label> <input min="0" name="green" type="number" placeholder="шт" /></p>

		<p><input type="button" value="Рассчитать стоимость доставки" id="tzUpCalc" onclick="AjaxFormRequest('result_div_id', 'tzFormCalc', '/delivery.php')" /></p>
	</form>
</section>

Содержимое файла delivery.php (обработчик запроса):

<?php
if ($_POST['city'] == "Ангарск") $code = "3800000400000000000000000";
if ($_POST['city'] == "Курск") $code = "4600000100000000000000000";


if (trim($_POST['home'])) $check = "true";
else $check = "false";


$weight = 0;
if ($_POST['blue'] > 0) { $weight += $_POST['blue'] * 20; }
if ($_POST['green'] > 0) { $weight += $_POST['green'] * 60; }


$data = array(
	"appKey" => "Ключ Деловых линий",
	"derivalPoint" => "Код_КЛАДР_пункта_отправки",
	"derivalDoor" => true,
	"arrivalPoint" => "{$code}",
	"arrivalDoor" => $check,
	"sizedVolume" => "0.2",
	"sizedWeight" => $weight
);


$json = json_encode($data);
$url = ('https://api.dellin.ru/v1/public/calculator.json');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$obj = json_decode($result);
curl_close($ch);


if ($_POST['doors'] > 0 OR $_POST['doors_2'] > 0) {
	if (trim($code)) {
		$result = ('<p>Откуда: '.$obj->{'derival'}->{'terminal'}.'<br />
		Куда: '.$obj->{'arrival'}->{'terminal'}.'<br />
		Синих слонов: '.$_POST['blue'].' шт.<br />
		Зеленых слонов: '.$_POST['green'].' шт.<br />
		Общий вес: '.$weight.' кг<br />
		Срок доставки: '.$obj->{'time'}->{'nominative'}.'<br />
		Стоимость доставки: '.$obj->{'price'}.' руб.</p>');
		echo $result;
	} else {
		echo ('<p>Вы не указали населенный пункт или Вашего города нет в списке.</p>');
	}
}
else { echo ('<p>Вы не указали количество слонов.</p>'); }

Ключ Деловых линий (ДЛ) можно получить зарегистрировавшись на сайте ДЛ.

Внедряем расчет ДЛ в метод доставки

Должен быть подключен КЛАДР.

Функция запроса стоимости от API деловых линий в зависимости от введенного города:

// Ajax-запрос на стоимость доставки
add_action( 'wp_ajax_delivery_nummer', 'get_ajax_delivery_nummer' );
add_action( 'wp_ajax_nopriv_delivery_nummer', 'get_ajax_delivery_nummer' );

function get_ajax_delivery_nummer() {
	
	if ( !empty($_POST['delivery']) ){		
	
		global $woocommerce;
		$weight = $woocommerce->cart->cart_contents_weight;

		$code = $_POST['delivery'];
		$code .= "000000000000"; // добавляем недостающие нули

		$data = array(
			"appKey" => "51370440-F976-4615-AB68-4DC272FE2712", // ключ пользователя ДЛ (не коммерческий)
			"derivalPoint" => "6100000100000000000000000", //город отправления (Ростов-на-Дону)
			"derivalDoor" => true, //доставка от дверей (в пределах города Ростов-на-Дону)
			"arrivalPoint" => "{$code}", //доставка до города
			"arrivalDoor" => 1, //$check, //доставка до дверей (в пределах выбранного города)
			"sizedVolume" => "0.2", //объем по умолчанию
			"sizedWeight" => $weight //вес
		);
		$json = json_encode($data);
		$url = ('https://api.dellin.ru/v1/public/calculator.json');
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$result = curl_exec($ch);
		$obj = json_decode($result);
		curl_close($ch);

		$stoimost = ($obj->{'price'});
	
		WC()->session->set('delivery_field', $stoimost);
	}
	die();
}	


// The jQuery Ajax request
add_action( 'wp_footer', 'checkout_delivery_fields_script' );
function checkout_delivery_fields_script() {
	// Only checkout page
	if( is_checkout() && ! is_wc_endpoint_url() ):

	// Remove "is_company" custom WC session on load
	if( WC()->session->get('delivery_field') ){
		WC()->session->__unset('delivery_field');
	}
	?>
	<script type="text/javascript">
		jQuery( function($){
			var a = 'input[name=shipping_city]';

			// Ajax function
			function checkdeliveryNummer( value ){
				 $.ajax({
					type: 'POST',
					url: wc_checkout_params.ajax_url,
					data: {
						'action': 'delivery_nummer',
						//'delivery': $('input[name=shipping_city]').val(),
						'delivery': $('input[name=shipping_city]').attr('data-kladr-id'),
						//'organisation': value != '' ? 1 : 0, //для валидации text или checkbox
					},
					success: function (result) {
						$('body').trigger('update_checkout');
					}
				});
			}

			// On start
			checkdeliveryNummer($(a).val());

			// On change event
			$(a).change( function () {
				checkdeliveryNummer($(this).val());
			});
		});
	</script>
	<?php
	endif;
};

Изменяем функцию calculate_shipping

if( WC()->session->get( 'delivery_field' ) ){
	$cost = WC()->session->get( 'delivery_field' );
} else {
	$cost = 0;
}

Конечно это еще очень сырое решение, нужно много чего дорабатывать.

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Виртуальный и Скачиваемый товар

Виртуальный и Скачиваемый товар

В интернет-магазине Woocommerce можно создавать Виртуальный и Скачиваемый товары. Разберемся как это выглядит и работает. Виртуальный товар Данная опция не меняет структуру товара. Если при оформлении в корзине только виртуальные Читать далее »

Методы доставки по городам

Методы доставки по городам

Стандартные средства настройки зоны доставки предоставляют на выбор страны а также ограничивают зону почтовыми индексами. Но на практике это не удобно, т.к. пользователь зачастую не знает своего индекса и не Читать далее »

Отправка писем с ссылкой на оплату

Отправка писем с ссылкой на оплату

Представим ситуацию что пользователь не оплатил во время (в течение 1 часа по умолчанию) заказ и он перешел в статус Отменен. Либо мы намерено изначально создаём заказ в статусе На Читать далее »

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

Пока нет комментариев. Будь первым!

Способ доставки Деловыми линиями
Metabox woocommerce
Рекомендации для васMetabox woocommerceOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.