top of page

Время доставки в интернет-магазине wix

  • Фото автора: Julia Sememova
    Julia Sememova
  • 18 февр. 2022 г.
  • 2 мин. чтения

Позвольте клиентам выбрать время доставки в процессе оформления заказа.

Время доставки в интернет-магазине wix

Описание

В этом примере мы даем покупателям магазина возможность выбирать предпочтительный временной интервал доставки. Когда покупатель переходит на страницу корзины, он может выбрать дату доставки и предварительно определенный интервал времени доставки. Выходные дни, указанные даты, например праздники, и временные интервалы, в которые достигается максимальное количество доставок, блокируются.




Пример кода

cart.jsw

import wixStores from 'wix-stores-backend';


export function getCurrentCart() {

return wixStores.getCurrentCart();

}

Страница Корзина

import wixWindow from 'wix-window';

import wixData from 'wix-data';

import { getCurrentCart } from 'backend/cart.jsw'


$w.onReady(function () {

$w('#updateTimeButton').hide();


getCurrentCart()

.then((response) => {

const cartId = response._id;


if (response.lineItems.length > 0) {

$w('#updateTimeButton').show();

findDelivery(cartId).then(() => {

displayLightbox(cartId);

});

}


$w('#updateTimeButton').onClick((event) => {

updateDeliveryTime(cartId);

});

});

});


async function findDelivery(cartId) {

wixData.query('deliveries')

.eq('cartId', cartId)

.find()

.then((results) => {

if (results.items.length > 0) {

displayDeliveryTime(results.items[0]);

} else {

$w('#deliveryDate').text = 'Delivery day';

$w('#deliveryTime').text = 'Delivery time';

}

})

.catch((err) => {

console.error(err);

});

}


function updateDeliveryTime(cartId) {

displayLightbox(cartId);

}


function displayDeliveryTime(data) {

$w('#deliveryDate').text = data.deliveryDate.toDateString();

$w('#deliveryTime').text = data.deliveryTime;

}


function displayLightbox(cartId) {

wixWindow.openLightbox('delivery details', {

cartId: cartId

})

.then((result) => {

displayDeliveryTime(result);

});

}

events.js

import wixData from 'wix-data';


const CONSTANTS = {

PICKUP_TITLE: 'Pickup from store',

PICKUP_TIME: '00:00'

}


function setOrderNumber(cartId, orderNumber) {

wixData.query('deliveries')

.eq('cartId', cartId)

.find()

.then((results) => {

if (results.items.length > 0) {

const item = results.items[0];

deliveryUpdate(cartId, orderNumber, item);

setDeliverySlot(item.date, item.deliveryTime);

} else {

console.log('Cart ID ' + cartId + ' not found');

}

})

.catch((err) => {

console.error('deliveryUpdate error', err);

});

}


function deliveryUpdate(cartId, orderNumber, itemToUpdate) {

wixData.get('deliveries', itemToUpdate._id)

.then((item) => {

item.orderNumber = orderNumber + '';

wixData.update('deliveries', item);

})

.catch((err) => {

console.error('deliveryUpdate error', err);

});

}


function updateDeliveryAvailability(item) {

wixData.get('deliveries-availability', item._id)

.then(result => {

result.counter = result.counter + 1;

wixData.update('deliveries-availability', result);

})

.catch((err) => {

console.error('updateDeliveryAvailability error', err);

});

}


function insertDeliveryAvailability(datObj, slot) {

let toInsert = {

'deliveryDate': datObj,

'deliveryTime': slot,

'counter': 1

};


wixData.insert('deliveries-availability', toInsert)

.then((response) => {

console.log('deliveries-availability insert', response)

})

.catch((err) => {

console.error('insertDeliveryAvailability error', err);

});

}


function setDeliverySlot(date, slot) {

const datObj = new Date(date).toDateString();


wixData.query('deliveries-availability')

.eq('deliveryDate', datObj)

.find()

.then((results) => {

if (results.items.length > 0) {

const itemToUpdate = results.items[0];


if (itemToUpdate.deliveryTime === slot) {

updateDeliveryAvailability(itemToUpdate); // date & slot exist

} else {

insertDeliveryAvailability(datObj, slot); // date exists, slot does not

}

} else {

insertDeliveryAvailability(datObj, slot); // date does not exist

}

})

.catch((err) => {

console.error('setDeliverySlot error', err);

});

}


export function wixStores_onNewOrder(event) {

getFullOrder(event.orderId)

.then(async (order) => {

setOrderNumber(order.cartId, order.number);

});

}


function getFullOrder(orderId) {

return wixData.get('Stores/Orders', orderId);

}





Коллекции​

Мы добавили 4 коллекции в этот пример:

  • Доставка: общая информация о доставке

  • DeliveryDisabledDates: отключенные даты (например, праздники).

  • DeliverySlots: предварительно определенные временные интервалы (например, 08:00–12:00, 14:00–18:00)

  • DeliveryAvailability: количество доставок на слот

Страницы и лайтбоксы​

Наш сайт содержит следующие страницы и лайтбоксы:

  • Страница корзины: содержит текстовые элементы дня и времени доставки для отображения выбранных сроков доставки, а также кнопку «Обновить время доставки» для открытия лайтбокса для изменения времени доставки.

  • лайтбокс сведений о доставке: содержит средство выбора даты для выбора даты доставки и элемент раскрывающегося списка для выбора предопределенного временного интервала доставки.

Бэкенд

Наш сайт содержит следующие внутренние файлы:

  • cart.jsw: получает информацию о текущей корзине.

  • events.js: обновляет доступность временных интервалов доставки в коллекциях.

npm-пакет

​Мы использовали Moment.js для упрощения обработки недоступности доставки в выходные дни.


Код​

Наш пример сайта содержит код, который выполняет следующие действия:


1. После того, как клиент добавит товар в свою корзину, получите данные корзины и проверьте существующий выбранный временной интервал доставки. Если клиент уже выбрал слот, отобразите его дату и время. Если клиент еще не выбрал временной интервал для доставки, откройте лайтбокс.


2. Когда лайтбокс откроется, проверьте коллекции на наличие следующего:

  • Если определенная дата и/или время недоступны (выходные, заблокированные дни/время), заблокируйте их с помощью средства выбора даты и раскрывающегося списка временных интервалов.

  • В соответствии с предопределенными настройками, если день покупки слишком близок к выходным, разрешайте временные интервалы только на следующей неделе.

  • Если для определенного временного интервала достигнуто максимальное количество выделенных доставок, не показывать этот интервал.


3. Когда клиент выбирает предпочитаемый слот и размещает заказ, обновляйте коллекции.


4. Позвольте покупателю обновить время доставки, нажав кнопку «Обновить доставку» на странице корзины.

Comments


bottom of page