[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.
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
что-то не работает авторизация через соцсети (Google, VK)
И второе, у меня заработала только такая конструкция (обнуляю для теста сумму);
Проверьте пожалуйста свой пример
PS что то со скобочками поэтому вот еще ссылка на картинку prntscr.com/m5pecz
П.С. Яна, пишите в техподдержку, чтобы вся переписка была в одном месте.