Skip to content

Instantly share code, notes, and snippets.

@TrywaR
Last active April 20, 2023 11:35
Show Gist options
  • Save TrywaR/bc75f76dfdc634c933838232700a0d8e to your computer and use it in GitHub Desktop.
Save TrywaR/bc75f76dfdc634c933838232700a0d8e to your computer and use it in GitHub Desktop.

Настройка доставки СДЕК в Modx Revo | Mihishop2

Возможности

  • Выбор адреса
  • В модальном окне
  • Возможность указать пункт выдачи
  • Выводятся поля пользователю
  • Подставляется цена в заказ

Как юзать

Предыстроия

  • Представим что вы получили ключ (код доступа и пароль), добавили виджет js в шапку, и закачали библиотеку servise.php на сайт из офф доки https://widget.cdek.ru

Настраиваем

  • Закидываем класс в дефолты /core/components/minishop2/custom/delivery
  • Добавляем плагин с событием "OnPageNotFound", для того чтобы сохранять цену в сессию
  • Из html можем всё запихать в чанк и вывести его в чанке заказа minishop'a
  • В настройках MiniShop2 добавляем адрес доставки сдек и указываем обработчик msDeliveryHandlerMsk ! Важно, у меня у этого способа доставки id = 2 и это учитывается в коде html, по этому если у вас другой, замените или там или там (:

  • В html нужно указать путь до библиотеки у вас на сайте вверху 2 строчи
  • Если подключить widjet.min.js будутет ошибка "ISDEKWidjet: No PVZ in city false" и бесконечная анимация, надо без min
  • Если доставка курьером, то в плагине будет ошибка типа у this.close(); нет такой функции, по этому меняем эту строчку так (это или 1708, или 1704 строка)
// widjet.close(); // old
template.controller.close(); // new
<div class="_deliv" id="del_2" style="display:none;" style="width: 100%;">
<script type="text/javascript">
var widjet = new ISDEKWidjet({
popup: true,
cityFrom: 'Санкт-Петербург',
defaultCity: 'Санкт-Петербург',
hidedress: true, // Скрыть примерку
hidecash: true,
detailAddress: true,
onChooseAddress: onChooseAddress,
path: 'https://[+ursite_path_to_scripts]',
servicepath: 'https://[+ursite_path_to_scripts]/service.php', //ссылка на файл service.php на вашем сайте
goods: [ // установим данные о товарах из корзины
{
length: 10,
width: 20,
height: 20,
weight: 5
}
],
onReady: function() { // на загрузку виджета отобразим информацию о доставке до ПВЗ
$(document).find('#linkForWidjet').css('display', 'block');
$(document).find('#linkForWidjet2').css('display', 'none');
},
onChoose: function(info) { // при выборе ПВЗ: запишем номер ПВЗ в текстовое поле и доп. информацию
console.log('info')
console.log(info)
$(document).find('[name="chosenPost"]').val(info.id);
$(document).find('[name="addresPost"]').val(info.PVZ.Address);
// расчет стоимости доставки
var price = (info.price < 500) ? 500 : Math.ceil(info.price / 100) * 100;
$(document).find('[name="pricePost"]').val(price);
$(document).find('[name="timePost"]').val(info.term);
var sStringAddress = ''
sStringAddress += 'Выбран пункт выдачи заказов: '
sStringAddress += info.id
sStringAddress += ', Адрес пункта: '
sStringAddress += info.PVZ.Address
sStringAddress += ', Стоимость доставки: '
sStringAddress += price
sStringAddress += ', Примерные сроки доставки: '
sStringAddress += info.term
$(document).find('[name="text_address"]').val(sStringAddress)
$.post("test.php", {
delivery_cdek_price: price
})
.done(function(data) {
miniShop2.Order.add('delivery', 2);
})
widjet.close(); // закроем виджет
}
});
function onChooseAddress(wat) {
console.log('wat')
console.log(wat)
var sStringAddress = ''
sStringAddress += 'Выбрана доставка курьером по адресу ' + wat.address + '\n'
sStringAddress += 'цена ' + wat.price + '\n'
sStringAddress += 'срок ' + wat.term + ' дн.'
$(document).find('[name="text_address"]').val(sStringAddress)
$(document).find('[name="watadress"]').val(wat.address)
$(document).find('[name="pricePost2"]').val(wat.price);
$(document).find('[name="timePost2"]').val(wat.term);
$(document).find('#linkForWidjet').css('display', 'none');
$(document).find('#linkForWidjet2').css('display', 'block');
$.post("test.php", {
delivery_cdek_price: wat.price
})
.done(function(data) {
miniShop2.Order.add('delivery', 2);
})
}
</script>
<button type="button" class="btn btn-lg" onclick='widjet.open()'>
Указать адрес доставки
</button>
<div id="linkForWidjet" style="display: none; margin-top: 2rem;" class="col-12">
<div class="form-group row input-parent">
<label class="col-md-4 col-form-label" style="max-width: 10rem; padding: .2rem 1rem .2rem .2rem; box-sizing:border-box; text-align: right;" for="chosenPost">
Выбран пункт выдачи заказов
</label>
<div class="col-md-8">
<input type="text" id="chosenPost" name="chosenPost" value="" class="form-control disabled" disabled>
</div>
</div>
<div class="form-group row input-parent">
<label class="col-md-4 col-form-label" style="max-width: 10rem; padding: .2rem 1rem .2rem .2rem; box-sizing:border-box; text-align: right;" for="addresPost">
Адрес пункта
</label>
<div class="col-md-8">
<input type="text" id="addresPost" name="addresPost" value="" class="form-control disabled" disabled>
</div>
</div>
<div class="form-group row input-parent">
<label class="col-md-4 col-form-label" style="max-width: 10rem; padding: .2rem 1rem .2rem .2rem; box-sizing:border-box; text-align: right;" for="pricePost">
Стоимость доставки
</label>
<div class="col-md-8">
<input type="text" id="pricePost" name="pricePost" value="" class="form-control disabled" disabled>
</div>
</div>
<div class="form-group row input-parent">
<label class="col-md-4 col-form-label" style="max-width: 10rem; padding: .2rem 1rem .2rem .2rem; box-sizing:border-box; text-align: right;" for="timePost">
Примерные сроки доставки
</label>
<div class="col-md-8">
<input type="text" id="timePost" name="timePost" value="" class="form-control disabled" disabled>
</div>
</div>
</div>
<div id="linkForWidjet2" style="display: none; margin-top: 2rem;" class="col-12">
<div class="form-group row input-parent">
<label class="col-md-4 col-form-label" style="max-width: 10rem; padding: .2rem 1rem .2rem .2rem; box-sizing:border-box; text-align: right;" for="watadress">
Выбрана доставка курьером по адресу
</label>
<div class="col-md-8">
<input type="text" id="watadress" name="watadress" value="" class="form-control disabled" disabled>
</div>
</div>
<div class="form-group row input-parent">
<label class="col-md-4 col-form-label" style="max-width: 10rem; padding: .2rem 1rem .2rem .2rem; box-sizing:border-box; text-align: right;" for="pricePost2">
Стоимость доставки
</label>
<div class="col-md-8">
<input type="text" id="pricePost2" name="pricePost2" value="" class="form-control disabled" disabled>
</div>
</div>
<div class="form-group row input-parent">
<label class="col-md-4 col-form-label" style="max-width: 10rem; padding: .2rem 1rem .2rem .2rem; box-sizing:border-box; text-align: right;" for="timePost2">
Примерные сроки доставки
</label>
<div class="col-md-8">
<input type="text" id="timePost2" name="timePost2" value="" class="form-control disabled" disabled>
</div>
</div>
</div>
<style media="screen">
.CDEK-widget__popup-mask {
z-index: 9999;
}
</style>
</div>
<?php
if(!class_exists('msDeliveryInterface')) {
require_once dirname(dirname(dirname(__FILE__))) . '/handlers/msdeliveryhandler.class.php';
}
class msDeliveryHandlerMsk extends msDeliveryHandler implements msDeliveryInterface{
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
// Отдаём цену доставки из сессии, если есть (o,o)
if( isset($_SESSION['delivery_cdek_price']) ){
$delivery_cost = parent::getCost($order, $delivery, $cost);
return $delivery_cost + (float)$_SESSION['delivery_cdek_price'];
}else{
$delivery_cost = parent::getCost($order, $delivery, $cost);
return $delivery_cost;
}
}
}
<?php
switch ($modx->event->name) {
case 'OnPageNotFound':
# Ловим цену доставки от сдека >-(-_-)-<
if ( $_REQUEST['delivery_cdek_price'] ) {
echo $_SESSION['delivery_cdek_price'] = (int)$_REQUEST['delivery_cdek_price'];
die();
}
break;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment