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

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

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

Работа с 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 есть функционал Апселлы и Кросселы. Апселлы Апселлы — лучшие товары которые вы бы рекомендовали в замен данному. К примеру, товары которые лучше по качеству или каким-то другим характеристикам, Читать далее »

Upgrade WC

Upgrade WC

Очередная серия улучшений (upgrade) плагина WC. Буду добавлять по мере изучения новые решения. Поиск по SKU (артикулу) Из коробки WC не ищет по артикулам (SKU). Но достаточно установить плагин Search Читать далее »

/

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

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

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