Новосибирск +7(983)

По всем вопросам :

Телеграм : @radgura

VirtueMart 3 - OnePage расчет расстояния до точки доставки

Заказать
Joomla 3.xС

Стоимость 1500


@radgura.ru
Адриена Лежена
63089
Новосибирск
Адриена Лежена
+7(983)
3067856
Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Статьи

Вы можете Заказать 1500руб. RUB

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

Для решения был использован виджет яндекса "Расчёт стоимости доставки" :

https://tech.yandex.ru/maps/jsbox/2.1/deliveryCalculator

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

ymaps.ready(init);
function init() {
// Стоимость за километр.
var DELIVERY_TARIFF = 0,
// Минимальная стоимость.
MINIMUM_COST = 0,
myMap = new ymaps.Map('map', {
center: [60.906882, 30.067233],
zoom: 9,
controls: []
}),
// Создадим панель маршрутизации.
routePanelControl = new ymaps.control.RoutePanel({
options: {
// Добавим заголовок панели.
showHeader: true,
title: 'Расчет расстояния',
width: '300px'
}
}),
zoomControl = new ymaps.control.ZoomControl({
options: {
size: 'small',
float: 'none',
position: {
bottom: 145,
right: 10
}
}
});
// Пользователь сможет построить только автомобильный маршрут.
routePanelControl.routePanel.options.set({
types: {auto: true}
});
// Если вы хотите задать неизменяемую точку "откуда", раскомментируйте код ниже.
routePanelControl.routePanel.state.set({
fromEnabled: false,
toEnabled: true,
from: 'Московская обл, Подольск, Железнодорожная ул., 20'
});
if (document.getElementById('lenghtaddres').value>0)
{
routePanelControl.routePanel.state.set({
to: document.getElementById('fulladdres').value
});
}
myMap.controls.add(routePanelControl).add(zoomControl);
// Получим ссылку на маршрут.
routePanelControl.routePanel.getRouteAsync().then(function (route) {
// Зададим максимально допустимое число маршрутов, возвращаемых мульти маршрутизатором.
route.model.setParams({results: 1}, true);
// Повесим обработчик на событие построения маршрута.
route.model.events.add('requestsuccess', function () {
var activeRoute = route.getActiveRoute();
if (activeRoute) {
// Получим протяженность маршрута.
var length = route.getActiveRoute().properties.get("distance"),
// Вычислим стоимость доставки.
price = calculate(Math.round(length.value / 1000)),
// Создадим макет содержимого балуна маршрута.
balloonContentLayout = ymaps.templateLayoutFactory.createClass('<span>Расстояние: ' + length.text + '.</span><br/>');
document.getElementById('lenghtaddres').value=Math.round(length.value / 1000);
document.getElementById('fulladdres').value=routePanelControl.routePanel.state.get("to");
document.getElementById('radseladrs').innerHTML='Адрес доставки : '+routePanelControl.routePanel.state.get("to")+'<br>Расстояние : '+Math.round(length.value / 1000)+' км.';
// Зададим этот макет для содержимого балуна.
route.options.set('routeBalloonContentLayout', balloonContentLayout);
// Откроем балун.
activeRoute.balloon.open();
}
});
});
// Функция, вычисляющая стоимость доставки.
function calculate(routeLength) {return Math.max(routeLength * DELIVERY_TARIFF, MINIMUM_COST);}
}

Для внедрения виджета необходимо внести код на страницы:

1.Блок с картой - размещаем сразу после элемента <div class="addressseleect opg-width-1-1 opg-margin-bottom ">

plugins/system/onepage_generic/cart/tmpl/default_right.php
<input type="hidden" id="urlsite" value="<?php echo JURI::root();?>">
<input type="hidden" id="lenghtaddres" value="<?php echo $_SESSION['rad_map_ln']?>">
<input type="hidden" id="fulladdres" value="<?php echo $_SESSION['rad_map']?>">
<hr>
<h3 class="opg-h3">Укажите адрес доставки</h3>
<script src="/https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<script src="/<?php echo JURI::root();?>js/deliveryCalculator.js" type="text/javascript"></script>
<div id="map" style="height:320px;width:100%;"></div>
<div class="clearfix"></div>
<hr>
<div style="text-align: right;"><span id="radseladrs" style="padding-right:20px;float: left;text-align: left;"></span><a class="btn sendadrs opg-button">Применить адрес</a></div>
</div>
<hr>

На этой же странице нужно разместить aJax запрос на изменение адреса

<script>
jQuery(document).ready(function() {
//обновляем фон категории
jQuery("body").on("click", ".sendadrs", function(e) {
var ids=this.id;
var myData = 'sendadrs='+document.getElementById('fulladdres').value+'&ln='+document.getElementById('lenghtaddres').value;
jQuery.ajax({
type: "POST",
url: document.getElementById('urlsite').value+"index.php?option=com_virtuemart&view=cart",
dataType:"text",
data:myData,
success:function(response){location.reload();},
error:function (xhr, ajaxOptions, thrownError){alert(thrownError);}
});
});
});
</script>

Прячем вариаты доставки, строка 218

if ($_SESSION['rad_map_ln']>0) 
{
?>
<div id="shipment_select" class="opg-width-1-1 opg-panel-box opg-margin-small-top <?php echo $shipmenthideclass; ?> rad_map_0" >
<h3 class="opg-panel-title"><?php echo JText::_('COM_VIRTUEMART_CART_EDIT_SHIPPING'); ?></h3>
<div id="shipment_fulldiv" class="opg-width-1-1">
<?php
$shipmentmethod_id = $this->cart->virtuemart_shipmentmethod_id;
$selectedshipment = "";
$shipmentpresent = 0;
foreach($this->shipments_shipment_rates as $rates)
{
if(strpos($rates, "checked") !== false)
{
$tmpdis = strip_tags($rates , '<span><img>');
echo '<table class="opg-table opg-table-striped" id="shipmenttable"><tr id="shipmentrow"><td id="shipmentdetails">';
$tmpdis = str_replace("</span><span>" , "</span><br /><span>", $tmpdis);
$tmpdis = str_replace("vmshipment_description" , "vmshipment_description opg-text-small rad_map_6", $tmpdis);
$tmpdis = str_replace("vmshipment_cost" , "vmshipment_cost opg-text-small rad_map_7", $tmpdis);
echo $tmpdis;
echo '</td>';
if(count($this->shipments_shipment_rates) > 1)
{
$target = "{target:'#shipmentdiv'}";
echo '<td id="shipchangediv" class="opg-width-1-4">';
echo '<a class="opg-button <?php echo $button_primary_class; ?>" href="#" data-opg-modal="'.$target.'">'.JText::_("PLG_SYSTEM_VMUIKIT_ONEPAGE_CHNAGE").'</a>';
echo '</td>';
}
echo '</tr></table>';
$shipmentpresent = 1;
}
}

if(!$shipmentpresent)
{
if(count($this->shipments_shipment_rates) > 0)
{
$tmpdis = strip_tags($this->shipments_shipment_rates[0] , '<span><img>');
echo '<table class="opg-table opg-table-striped" id="shipmenttable"><tr id="shipmentrow"><td id="shipmentdetails">';
$tmpdis = str_replace("</span><span>" , "</span><br /><span>", $tmpdis);
$tmpdis = str_replace("vmshipment_description" , "vmshipment_description opg-text-small", $tmpdis);
$tmpdis = str_replace("vmshipment_cost" , "vmshipment_cost opg-text-small rad_map_8", $tmpdis);
echo $tmpdis;
echo '</td>';
if(count($this->shipments_shipment_rates) > 1)
{
$target = "{target:'#shipmentdiv'}";
echo '<td id="shipchangediv" class="opg-width-1-4">';
echo '<a class="opg-button <?php echo $button_primary_class; ?>" href="#" data-opg-modal="'.$target.'">'.JText::_("PLG_SYSTEM_VMUIKIT_ONEPAGE_CHNAGE").'</a>';
echo '</td>';
}
echo '</tr></table>';
$shipmentpresent = 1;
}
else
{
$text = "";
$shipmentnilltext = vmInfo('COM_VIRTUEMART_NO_SHIPPING_METHODS_CONFIGURED', $text);
echo '<p id="shipmentnill" class="opg-text-warning">'.$shipmentnilltext.'</p>';
}
}
?>
</div>
</div>
<?php
}

2.Блок выбора способов доставки. Добавляем код фильтрации на строке 274

plugins/system/onepage_generic/cart/tmpl/default_modalpage.php 
foreach($this->shipments_shipment_rates as $rates) 
{
$con=1;
if(strpos($rates, "checked") !== false)
{$actclass = "liselcted";}
else
{$actclass = "";}
if ($_SESSION['rad_map_ln']>=0)
{
//расстояние меньше 15 км
if ($_SESSION['rad_map_ln']<=15)
{
if(strpos($rates, "shipment_id_5") == true) $con=0;
}
else//больше 15 км
{
if(strpos($rates, "shipment_id_4") == true) $con=0;
if(strpos($rates, "shipment_id_3") == true) $con=0;
}
}
if ($con==1)
{
echo '<li class="'.$actclass.' rad_map_9">';
echo '<label class="opg-width-1-1">'.$rates.'</label>';
echo '</li><hr class="opg-margin-small-bottom opg-margin-small-top" />';
}
}

3.Блок поля адреса и кнопки "Оформить заказ"

plugins/system/onepage_generic/cart/tmpl/default_shopper.php 

Кнопка "оформить заказ" строка 886

if ($_SESSION['rad_map_ln']>=0)
{
echo '<p id="bottom_total" class="opg-text-large opg-text-primary opg-text-bold opg-text-center">'.JText::_("COM_VIRTUEMART_CART_TOTAL").'&nbsp;:&nbsp;<strong class="opg-text-large opg-text-primary opg-text-bold" id="carttotal"></strong></p>';
echo '<a class="opg-button '.$button_primary_class.' opg-button-large opg-margin-top opg-width-1-1" href="javascript:void(0);" onclick="submit_order();"><span>' . JText::_('COM_VIRTUEMART_ORDER_CONFIRM_MNU') . '</span></a>';
}

4.Обработка aJax запроса

plugins/system/onepage_generic/onepage_generic.php
if (isset($_POST['sendadrs']) and strlen($_POST['sendadrs']))
{
$adr=$_POST['sendadrs'];
$ln=$_POST['ln'];
$_SESSION['rad_map']=$adr;
$_SESSION['rad_map_ln']=$ln;
echo 'test';
exit();
}

Комментарии (0)

Здесь ещё нет оставленных комментариев.

Оставьте свой комментарий

  1. Добавление комментария от гостя.
Вложения (0 / 3)
Share Your Location

Как с нами связаться

По всем вопросам пишите  

Телеграм: @radgura

OnLine заказ

Отправить сообщение

Нажимая на кнопку «Отправить сообщение», я соглашаюсь:
* с условиями публичной оферты
* обработку моих персональных данных


RAD компоненты

Please publish modules in offcanvas position.