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

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

NEW

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

Работа с 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;
}

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

Тэги:

Поделится информацией с друзьями

  • Похожие записи
  • Комментарии
  • Вложения
Отключаем стандартные метабоксы

Отключаем стандартные метабоксы

Отключая стандартные метабоксы, мы фактически избавляемся изначально от лишнего функционала. При отключении метабоксов мы также отключаем сами поля, что позволяет существенно разгрузить таблицу wp_postmeta (особенно если у сайта несколько тысяч Читать далее »

Оформление заказа

Оформление заказа

Страница оформления плагина woocommerce имеет определенную структуру и функционал. Но данная структура не совсем удобна. Доработаем страницу оформления, разбив на логические блоки: Заказ, Доставка, Форма оплаты, Информация о заказчике и Читать далее »

/
Подарок за покупку

Подарок за покупку

Изучим и рассмотрим такой инструмент продаж как подарок за покупку. Вариантов такого поощрения может быть масса: подарок при покупке конкретного товара (из конкретной категории), подарок при наборе в корзине определенной Читать далее »

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

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

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