/commerce-booking

Booking management addon for Evolution CMS Commerce

Primary LanguageCSS

Компонент посуточного бронирования для Commerce.

image

Бронирование представляет собой товар с дополнительными свойствами - датой начала бронирования и датой завершения бронирования. При добавлении такого товара в корзину проверяется, свободны ли заданные даты для бронирования. Такая же проверка производится для товаров в корзине при оформлении заказа.

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

При отмене заказа связанные с ним бронирования удаляются.

Менеджер может добавлять и изменять бронирования с помощью модуля.

Компонент бесплатен благодаря поддержке сообщества.

Установка

Установить, запустить модуль. Перед этим обязательно должен быть установлен Commerce. В списке событий плагин Booking должен идти после Commerce.

Форма для добавления в корзину

<form action="#" data-commerce-action="add">
    <input type="hidden" name="id" value="[*id*]">
    <input id="checkin" name="meta[begin]" placeholder="начало" />
    <input id="checkout" name="meta[end]" placeholder="конец" />
    <button type="submit">Добавить</button>
</form>

После добавления в корзину товару добавится также поле meta[type] со значением booking. При проверке корзины в процессе оформления заказа может быть добавлено также поле meta[notavailable], чтобы можно было показать, какие товары стали недоступны для бронирования.

Настройка

В параметрах плагина Booking задается:

  • модель MODxAPI для работы с документами (по умолчанию - \modResource);
  • шаблоны документов для бронирования, через запятую;
  • имя тв-параметра в котором указывается цена бронирования за сутки;
  • формат даты, который используется на сайте;
  • ID статуса отмены заказа;
  • имя лексикона для использования на сайте.

Серверные события

OnBookingCalculatePrice

Вызывается после расчета стоимости бронирования. Можно изменить стоимость или добавить дополнительные свойства.

Параметры:

Имя параметраПередается по ссылкеОписание
priceДастоимость бронирования
itemObjДаобъект MODxAPI для документа
itemДаданные товара в корзине
daysНетдлительность бронирования в сутках

OnBookingItemCheck

Вызывается после проверки дат для бронирования. Позволяет реализовать дополнительную логику проверки.

Параметры:

Имя параметраПередается по ссылкеОписание
itemObjДаобъект MODxAPI для документа
beginНетдата начала бронирования
endНетдата завершения бронирования
availableДарезультат проверки (true или false)

Серверный API

Вызов:

ci()->booking->метод(параметры);

Проверка дат (isAvailable)

Параметры:

  • id документа;
  • дата начала;
  • дата завершения;
  • формат даты в параметрах (если не указан, то берется из настроек плагина).

Возвращает true или false.

$result = ci()->booking->isAvailable(10, '01.01.2024', '10.01.2024', 'd.m.Y');

Получение списка занятых дат (getReservations)

Параметры:

  • id документа;
  • дата начала;
  • дата завершения;
  • формат даты в параметрах (если не указан, то берется из настроек плагина).

Возвращает массив с датами.

$result = ci()->booking->getReservations(10, '01.01.2024', '10.01.2024', 'd.m.Y');
[
    ['2023-12-20', '2024-01-03'],
    ['2024-01-05', '2024-01-07'],
]

Работа с БД

На основе MODxAPI.

use Pathologic\Commerce\Booking\Model;

$model = new Model($modx);
$result = $model->create([
    'docid'       => 10, //id документа
    'begin'       => '2024-01-01', //дата начала
    'end'         => '2024-01-10', //дата завершения
    'orderid'     => 0, //для связи с заказом
    'description' => 'тест', //описание
    'hash'        => '' //хэш записи, если не указывать, то создастся автоматически
])->save();

Получение списка занятых дат на фронте

let bookedDates;
$.post('/booking/reservations', {
    begin: '01.01.2024',
    end: '10.01.2024',
    id: 10,
    }, function(response) {
         if(response instanceof Array) {
            bookedDates = response.map(d => {
                if (d instanceof Array) {
                    const start = new Date(d[0]);
                    const end = new Date(d[1]);

                    return [start, end];
                }
            });
        }
}, 'json');