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

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

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;
}

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

[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Лэйблы используя PHP

Лэйблы используя PHP

Как делать создание лэйблов налету средствами jQuery используя post_class описано здесь. В данной статье сделаем вывод подобных лэйблов средствами WordPress (PHP). Данный способ даст более гибкий и универсальный подход к Читать далее »

Выравнивание миниатюр товаров

Выравнивание миниатюр товаров

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

/
Отключаем лишний функционал Woocommerce

Отключаем лишний функционал Woocommerce

Отключаем невостребованные функции Woocommerce, чтобы было легче работать, не захламлять админку и не путать заказчиков. Отключить типы товаров Удалить чекбоксы виртуальный и загружаемый товары Удалить их также из фильтра админки: Читать далее »

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

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

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