• Блог
  • [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.

    29 мая 2018, 10:33   370     0

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

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

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