• Блог
  • [oneBooking] События, фильтры...

По результатам вопросов и просьб о доработках я определил возможный функционал, который можно добавить без переписывания компонента заново. Основная задача — добавить гибкости на сайте и в админке. Что добавлено:

События плагинов

  • obOnBeforeCalcSum — событие, которое вызывается перед расчётом суммы бронирования. Позволяет изменить стоимость объекта бронирования в зависимости от условий. В плагине доступны следующие переменные:
    • $object — объект бронирования. Цена меняется через $object->price.
    • $data — данные из запроса (дата начала, дата окончания, количество и т.д.).
  • obOnBeforeBooking — срабатывает перед сохранением заявки на бронирование в БД. В плагине доступен объект заявки:
    • $booking — объект заявки на бронирование.

    Позволяет изменять данные заявки.

    switch ($modx->event->name) {
        case 'obOnBeforeBooking':
            // Если количество дней бронирования больше 10, то уменьшаем сумму на 10%
            if (strtotime($booking->end_date) - strtotime($booking->start_day) / 86400 > 10) {
                $booking->sum *= 0.9;
            }
    }
            

    Доступные свойства объекта бронирования можно подсмотреть в таблице onebooking_reserved.

  • obOnAfterBooking — срабатывает после сохранения заявки на бронирование в БД. В плагине доступен объект заявки:
    • $booking — объект заявки на бронирование.

    Можно использовать для манипуляций (выполнить определённые действия, отправить почту и т.п.) в случае успешного сохранения заявки.

Фильтры

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

Файлы фильтров должны размещаться в папке core/components/onebooking/filters. Для примера добавлено 2 фильтра — DialogFilter и SearchFilter. По аналогии можно создать собственные фильтры.

В фильтрах доступно 3 события:

  • openDialog — используется при открытии диалога.
  • getSum — используется при определении стоимости брони. Сработает и при нажатии кнопки определения суммы в диалоге и при сохранения заявки в БД.
  • search — используется при формировании списка доступных объектов сниппета obSearch.

Они определяются в свойстве $this->oneBooking->action. Если их не указать, то фильтр сработает для всех 3-х событий. В этом случае возможен непредсказуемый результат. Для каждого события передаётся свой набор данных в параметре $data. Его можно вывести в лог, чтобы посмотреть какие данные он содержит.

Приведу пример фильтра DialogFilter, добавляющий сумму в массив $data['sum'], который будет использован при рендеринге чанка диалога. Соответственно в чанке нужно добавить плейсхолдер [[+sum]]

class DialogFilter extends Filter
{
    public function handle(array $data)
    {
        if ($this->oneBooking->action == 'openDialog') {
            $data['sum'] = $this->oneBooking->getSum($data);
        }

        return $data;
    }
}

Подключаются фильтры в сниппетах в параметре filters через запятую. Указывать нужно имя файла без расширения:

[[!obCalendar? 
    &objects=`*` 
    &interface=`dialog` 
    &type=`period` 
    &filters=`DialogFilter`
]] 

Системные настройки

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

  • onebooking.showTab_booking — показать/скрыть таб с заявками.
  • onebooking.showTab_objects — показать/скрыть таб с объектами.
  • onebooking.showTab_extras — показать/скрыть таб с дополнительными полями.

Управлять этими настройками можно динамически. Для этого нужно создать плагин на событие OnManagerPageBeforeRender. Только обязательно нужно выставить отрицательный приоритет, чтобы плагин сработал до плагина oneBooking.

switch ($modx->event->name) {
    case 'OnManagerPageBeforeRender':
        // Для менеджеров отключаем все вкладки кроме заявок
        if ($modx->user->isMember('Managers')) {
            $modx->setOption('oneBooking_showTab_objects', false);
            $modx->setOption('oneBooking_showTab_extras', false);
        }
        break;
}

Заключение

Ещё просили убрать вкладку «Помощь». Сделал как просили. Также обновил jQuery и jQuery UI. Думаю, эти доработки окажутся полезны.

Компонент достаточно востребован. Поэтому, учитывая напопленный опыт и знания, записал себе в список TODO создание подобного модуля для Laravel.

0   2497

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

  1. Яна 11 января 2019 # 0
    День добрый)
    что-то не работает авторизация через соцсети (Google, VK)
    И второе, у меня заработала только такая конструкция (обнуляю для теста сумму);
    Проверьте пожалуйста свой пример
    PS что то со скобочками поэтому вот еще ссылка на картинку prntscr.com/m5pecz

    public function handle(array $data)
        {
            /**
             * Доступные действия: "openDialog", "getSum", "search".
             */
             if ($this->oneBooking->action == 'getSum') {
                 $data['sum']['data']['sum'] = 0 ;
             }
    
            return $data;
        }
    1. Сергей Шлоков 11 января 2019 # +1
      Проверю, но только завтра. Может из-за вчерашнего обновления что-то сломалось.

      П.С. Яна, пишите в техподдержку, чтобы вся переписка была в одном месте.

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

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.