Skip to content

Instantly share code, notes, and snippets.

@iKrevedko
Last active August 1, 2022 08:30
Show Gist options
  • Save iKrevedko/2970642ee0f7e060ea89 to your computer and use it in GitHub Desktop.
Save iKrevedko/2970642ee0f7e060ea89 to your computer and use it in GitHub Desktop.
Важно!!
После того, как вы добавили обработчик события 'inited:insales:checkout:deliveries'
нужно вызвать событие 'ready:insales:delivery' (можно для document), которое сообщает нам о том, что вы готовы обрабатывать события.
В этом случае если событие 'inited:insales:checkout:deliveries' уже сработало, мы сгенерируем его повторно.
Для вызова событий необходимо использовать CustomEvent
// Для удобства вызова события можно добавить метод jQuery
if (typeof $.fn.triggerCustom !== 'function') {
$.fn['triggerCustom'] = function(type, data, options) {
if (options == null) {
options = {};
}
options = $.extend({}, {
bubbles: true,
cancelable: true,
detail: data
}, {
bubbles: options.bubbles,
cancelable: options.cancelable
});
return this.each(function() {
var e;
e = new window.CustomEvent(type, options);
return this.dispatchEvent(e);
});
}
}
Если вы используете jQuery для обработки событий, то получить данные можно как уазано в примерах.
$(document).on('inited:insales:checkout:deliveries', function(e) { data ... }) - инициализированы способы доставки. Происходит каждый раз когда покупатель меняет Страну\Регион\Город\Индекс
data = e.originalEvent.detail
data = {
"order": {
"comment":"",
"referer":"",
"currency_code":"UAH",
"currency_unit":"грн.",
"shipping_address": {
"address":"dfgdfgdfgdfg",
"country":"RU",
"middlename":"asdf",
"name":"ssdf",
"phone":"+79261111111",
"surname":"seser",
"region":"обл Московская",
"city":"",
"zip":"1234567",
"fields_values":[]
},
"client": {
"client_group_id":null,
"created_at":"2014-04-15T15:11:57+04:00",
"email":"test123@test.com",
"id":46613,
"middlename":"asdf",
"name":"ssdf",
"phone":"+79261111111",
"registered":true,
"subscribe":true,
"surname":"seser",
"fields_values":[
{"field_id":117040,"name":"Подписка на новости","value":"0","human_value":"Нет"}
]
},
"recipient": {
"name": "ssdf",
"surname": "seser", #Поле может отсутствовать если оно выключено в настройках
"middlename": "asdf", #Поле может отсутствовать если оно выключено в настройках
"phone": "+79261111111",
"email": "test123@test.com"
},
"order_lines":[
{"product_id":227777,"quantity":1,"sku":null,"title":"23452345","variant_id":318919,"weight":null,"sale_price":1192},
{"product_id":149504,"quantity":1,"sku":null,"title":"2414223","variant_id":202900,"weight":null,"sale_price":33},
{"product_id":230764,"quantity":1,"sku":null,"title":"Магнитола Sony CFD-S03CP","variant_id":322194,"weight":null,"sale_price":27}
],
"discounts":[
{"description":"Более 100р. скидка 10р.","amount":10}
],
"total_weight":0,
"items_price":1242,
"fields_values":[
{"field_id":127921,"name":"carrier_id","value":"sdfsdf","human_value":"sdfsdf","delivery_variant_group_name":15323},
{"field_id":127922,"name":"carrier_name","value":"sdfsdf","human_value":"sdfsdf","delivery_variant_group_name":15323},
{"field_id":127923,"name":"carrier_pickpoint_name","value":"","human_value":"","delivery_variant_group_name":15323},
{"field_id":127924,"name":"carrier_pickpoint_address","value":"","human_value":"","delivery_variant_group_name":15323}
]
},
"deliveries":{
"15325":{"id":15325,"html_id":"#order_delivery_variant_id_15325","available":true,"active":true,"price":120,"description":null,"description_html":null,"fields_values":[],"selected":false,"is_external":false,"external_url":false,"external_data":{}},
"15326":{"id":15326,"html_id":"#order_delivery_variant_id_15326","available":true,"active":true,"price":250,"description":null,"description_html":null,"fields_values":[],"selected":true,"is_external":false,"external_url":false,"external_data":{}}
}
}
$('#order_delivery_variant_id_123').on('updated:insales:checkout:recipient', function(e) { order ... }) - Обновлены данные получателя
$('#order_delivery_variant_id_123').on('updated:insales:checkout:delivery', function(e) { order ... }) - способ доставки обновлен
order = e.originalEvent.detail
order = {
...
"delivery": {
"id": 123,
"available": true,
"active": true,
"html_id": '#order_delivery_variant_id_123',
"price": 123,
"fields_values": [],
"selected": false,
"description": null,
"description_html": null,
"is_external": true,
"external_url": null,
"external_data": {}
}
}
$('#order_delivery_variant_id_123').on('selected:insales:checkout:delivery', function(e) { order ... }) - способ доставки выбран. Срабатывает один раз т.е. если пользователь кликнул 3 раза, событие вызоветься только один раз
order = { ... } см. updated
$('#order_delivery_variant_id_123').on('unselected:insales:checkout:delivery', function(e) { order ... }) - выбран другой способ доставки, где delivery предыдущий способ доставки
order = { ... } см. updated
$('#order_delivery_variant_id_123').triggerCustom('update:insales:delivery', delivery) - обновить способ доставки (скрывает спинер и очищает ошибки)
После обновления способа доставки пересчет и отрисовка общей стоимости заказа, стоимости доставки, а так же добавление скрытых полей со значением стоимости доставки, доп полей, описания доставки происходит на стороне InSales. Теперь нет необходимости вручную добавлять скрытые поля и следить за их очисткой при смене способа доставки.
delivery = {
"price": 100, // Стоимость доставки
"fields_values": [{"field_id": 123, "value": 'test'}], // Доп поля заказа
"is_external": true, // Флаг внешнего способа доставки. У доставок помеченных таким флагом не обновляется стоимость при получении с сервера доступных способов доставки. Так же при сохранении заказа на сервер передаются стоимость доставки и значения доп полей
"description": 'my external delivery', // Описание способа доставки которое сохраниться в заказе при создании.
"description_html": '<b>my external delivery</b>', // Описание способа доставки выводимое в списке доставок
"external_data": {"my_data": 'test'} // Произвольные данные которые можно хранить в доставке. НЕ сохраняются.
}
$('#order_delivery_variant_id_123').triggerCustom('calculating:insales:delivery') - способ доставки расчитывается (выводиться спинер, стоимость доставки скрывается)
$('#order_delivery_variant_id_123').triggerCustom('hide:insales:delivery') - скрыть способ доставки (способ доставки при этом не дизейблиться и можно его выбрать програмным способом)
$('#order_delivery_variant_id_123').triggerCustom('show:insales:delivery') - показать способ доставки
$('#order_delivery_variant_id_123').triggerCustom('enable:insales:delivery') - активировать способ доставки
$('#order_delivery_variant_id_123').triggerCustom('disable:insales:delivery') - выключить способ доставки (не позволяет выбрать способ доставки)
$('#order_delivery_variant_id_123').triggerCustom('error:insales:delivery', 'Способ доставки не доступен') - вывести сообщение об ошибке
$('#order_delivery_variant_id_123').triggerCustom('preventSubmit:insales:delivery') - Запретить создание заказа (если требуется заполнение полей)
1. Форма заказа не будет отправлена на сервер только в случае, когда даный способ доставки выбран пользователем
2. Перед вызовом события inited:insales:checkout:delivery флаг принудительно сбрасывается
3. После нажатия на кнопку создать заказ генерируется событие 'submitPrevented:insales:checkout'
$('#order_delivery_variant_id_123').on('submitPrevented:insales:checkout')
$('#order_delivery_variant_id_123').triggerCustom('allowSubmit:insales:delivery') - Разрешить создание заказа
$('document').triggerCustom('update:insales:recipient', recipient)
recipient = {
"name": "ssdf",
"surname": "seser", #Поле может отсутствовать если оно выключено в настройках
"middlename": "asdf", #Поле может отсутствовать если оно выключено в настройках
"phone": "+79261111111",
"email": "test123@test.com"
}
Порядок событий при загрузке страницы оформления заказа или смены адреса
1) inited:insales:checkout:deliveries
2) unselected:insales:checkout:delivery - вызыается только если полсле получения списка доступных способов доставки способ доставки был помечен как недоступный (нпаример из-за ограничения по региону)
3) selected:insales:checkout:delivery - при первой загрузке вызывается у первого доступного. При повторной загрузке, у ранее выбранного пользователем.
(Может не вызваться если для выбранного способа доставки это событие уже было вызвано и способ доставки не изменился)
4) unselected:insales:checkout:payment - вызывается если выбранный способ оплаты не доступне для выбранного способа доставки
5) selected:insales:checkout:payment - при первой загрузке вызывается у первого доступного. При повторной загрузке, у ранее выбранного пользователем.
(Может не вызваться если для выбранного способа оплаты это событие уже было вызвано и способ оплаты не изменился)
@sgoldyaev
Copy link

Дима, я правильно понимаю что ты checkout в insales.ru кастомизируешь ? Можешь подсказать как подрубиться на событие успешного создания заказа в магазине и отправить данные логистам в другую систему?

  1. $(document).on('submitPrevented:insales:checkout', function(e) { data ... }) и в data будет вся инфа по заказу?
  2. где повесить этот обработчик ?

@timurey
Copy link

timurey commented Apr 7, 2020

В checkout не хватает событий по обновлению DOM внешних вариантов доставки. Пришлось использовать MutationObserver:

    // Наблюдаем только за списком способов доставки
    var target = document.getElementById('delivery_variants');
    // Извлекаем id внешних способов доставки
    let externalDeliveries = Object.values(JSON.parse(target.dataset.deliveryVariants)).filter(deliveryVariant => deliveryVariant.is_external == true).map(item => item.id);

    // Функция обратного вызова при срабатывании мутации
    const callback = function (mutationsList, observer) {
        for (let mutation of mutationsList) {
            if (mutation.target.classList.contains("co-tabs-content")) {
                for (let node of mutation.addedNodes) {
                    externalDeliveries.forEach(id => {
                        if (node.attributes.getNamedItem("data-delivery-tariffs-" + id) !== null) {
                            console.log("Added external delivery variants", id);
                            // Здесь будет необходимый код
                            //
                            // observer.disconnect(); // Если оставить, то обновление происходит только для одного внешнего способа доставки
                        }
                    })
                }
            }
        }
    };

    // Создаем экземпляр наблюдателя с указанной функцией обратного вызова
    const observer = new MutationObserver(callback);
    $(document).on('inited:insales:checkout:deliveries', function (e) {
        console.log("inited:insales:checkout:deliveries")
        // Начинаем наблюдение за настроенными изменениями целевого элемента
        observer.observe(target, { childList: true, subtree: true });
    })

@VladimirIvanin
Copy link

Для чекаута 2.0

Функция для ручного пересчёта доставок get_deliveries()
Функция для ручного пересчёта оплат get_payments()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment