[oneBooking 3.3.0] Собственные формы и поиск

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

В этот раз я решил обойтись без моделей и таблиц, а использовал формат YAML. Описание полей загружается из файла /core/components/onebooking/extras/booking.extras.yaml. В нем указываете свои поля. Для примера там же лежит файл example.booking.extras.yaml. Можете переименовать его, а можете создать новый по образцу. В файле подробно описан формат полей.
Для удобства можно создать статический чанк и указать этот файл в качестве исходника.
Для примера приведу описание поля формы типа «select»
// Название поля
select_field:
	// Для вывода на сайте
	field: |
		<label class="labelform" for="select_field">Список</label>
		<select class="ob-extras-textarea form-control" name="select_field" id="select_field">
			<option value="500">Один</option>
			<option value="1000" selected>Два</option>
			<option value="1500">Три</option>
		</select>
	// Название поля
	label: Список
	// Учитывать стоимость один раз или каждый день
	apply_once: 0
	// Учитывать сумму в акциях или нет
	calc_after: 0
	// Признак, что поле не информационное и его нужно учитывать в расчетах стоимости.
	calculate: 1
	// Признак, что поле обязательное
	required: 1
	// Тип поля (для интерфейса администратора)
	type: select
	// Значение по-умолчанию
	default: 500
	// Элементы списка в формате "стоимость:заголовок в списке"
	items:
		500: Один (500)
		1000: Два (1000)
		1500: Три (1500)

Добавленные поля сразу появляются в диалоге создания заявки на бронирование в интерфейсе администратора


А для того, чтобы добавить поля в форму на сайте, нужно в чанке формы добавить соответствующие плейсхолдеры. Например, так
<form>
	...
	<div class="form-group">
		[[+city]]
	</div>
	<div class="form-group">
		[[+select]]
	</div>
	<div class="form-group">
		[[+radio]]
	</div>            
</form>
Мне кажется это не сложно.
Таким образом можно делать любые формы. Надо только помнить об обязательных полях «object»,«start_date»,«end_date» и «nubmer» (что, когда и сколько). В качестве примера можно использовать стандартную форму.
Для подключения своих форм добавлены системные настройки frontend_js и frontend_css для собственных файлов стилей и скриптов. Позже постараюсь сделать примеры-заготовки.

Еще появилась очень полезная вещь — поиск доступных объектов на заданную дату. Выглядит это так

Вызывается сниппетом obSearch. Поближе посмотреть можно тут.

Также в сниппеты obCalendar, obForm и obButton добавлен параметр resource, который будет очень полезен при вызове сниппетов на странице ресурса-продукта miniShop2. Т.е. на таких страницах эти сниппеты можно вызывать без параметра object, а так
[[!obCalendar? &recource=`[[*id]]`]]
// или даже без параметра
[[!obCalendar?]]
Объект автоматически подтянется из связи «объект-продукт».

Кроме того, обновлены некоторые чанки. Они указаны в changelog. Их нужно отметить при обновлении компонента или обновить вручную.

Для информации

Компонент из простого календаря бронирования постепенно вырос в систему бронирования. Много уже добавлено. И еще планируется. В связи с чем стоимость компонента выросла. Но все равно ниже аналогичной в Wordpress.

Полная документация.
Сергей Шлоков
Сергей Шлоков
23 ноября 2015, 10:38
modx.pro
3 244
Поблагодарить автора Отправить деньги

Комментарии: 25

Григорий Коленько
23 ноября 2015, 18:11
А к поиску фильтры какие-то прикрутить выйдет? Или какая-то есть возможность связать с msearch2?
    Сергей Шлоков
    23 ноября 2015, 18:51
    Нет. mSearch2 работает только с таблицами ресурсов.
    А зачем?
      Григорий Коленько
      23 ноября 2015, 18:55
      Ну к примеру, чтобы можно было указать цену от и до + какие-то плюшки типа телевизора или бассейна выбрать можно было
      Василий Наумкин
      23 ноября 2015, 20:47
      Не совсем так.

      Если прописать свои методы и использовать свой сниппет вывода — сможет фильтровать что угодно.
    Александр
    07 июля 2016, 13:25
    При добавлении дополнительных полей, которые должны учитываться при подсчете суммы, нужно еще добавить значение этого поля в post запрос. Иначе сумму в форме выдает без учета этого поля.

    И у меня в интерфейсе «dialog» не обрабатывается некэшированный вызов obExtras.
      Сергей Шлоков
      08 июля 2016, 06:53
      Проверим.
        Сергей Шлоков
        12 июля 2016, 18:12
        В новой версии всё работает. Сниппет obExtras больше не нужен. Можно просто указывать плейсхолдеры полей в форме — [[+my_field]]. Поля рендерятся и считаются. Обновляйтесь.
      Игорь
      13 июля 2016, 00:27
      По ссылке «Полная документация» — пусто, за доработку компонента — спасибо! Планируется ли разработка аналогичного компонента для суточной аренды жилья (квартир)?
        Сергей Шлоков
        13 июля 2016, 07:19
        Документация в процессе наполнения. Скоро будет.
        Планируется ли разработка аналогичного компонента для суточной аренды жилья (квартир)?
        Что имеется ввиду? Почасовой?
          Игорь
          13 июля 2016, 13:50
          1. Нет, период бронирования — сутки. В календаре «день» очень желательно разделить на 2 части: «до 12.00» (выселение) и «после 12.00» (расселение), так как общепринятое расчетное время 12.00.
          2. В данном виде компонент оптимален для гостиниц с небольшим номерным фондом, так как форма бронирования через диалог не позволяет работать с большим количеством объектов (к примеру, на сайте 100 квартир, из них 20 однокомнатных, 40 двухкомнатных и 40 трехкомнатных).
          3. Потребуется интеграция с msearch2 (или аналогом) — возможность поиска объектов по уникальному номеру, категориям (например — однокомнатные, двухкомнатные, трехкомнатные), датам заезда-выезда, стоимости, количеству спальных мест.
            Сергей Шлоков
            13 июля 2016, 16:54
            1. Для этого есть параметр type. В данном случае ему нужно указать значение period. В следующей версии переименую значение в checkout для большей очевидности.
            2. Почему? В чем проблема?
            3. Уже есть готовый сниппет поиска. Его можно доработать. mSearch2 из коробки искать не будет. Ему нужно прописывать алгоритмы и делать свой сниппет. Дополнительно встает вопрос цены mSearch2 и работ по его доработке. Выбор ваш.
              Игорь
              13 июля 2016, 21:17
              1. Спасибо, вы правы
              2. Форма бронирования через диалог отлично работает с категориями объектов (люкс, стандарт, эконом и т.д). Если вместо категорий укажем объекты (например, 100 квартир) — получим огромный выпадающий список.
              3. Номерной фонд гостиниц не требует фильтрации объектов, а сайт недвижимости (как и интернет-магазин) не может без нее полноценно работать. Поэтому необходима интеграция с msearch2 или его аналог.
                Сергей Шлоков
                13 июля 2016, 21:45
                По второму пункту. В диалоге указываются именно объекты, а не категории. Такой сущности в oneBooking нет. А зачем в диалоге указывать 100 квартир. Можно на сайте создать страницу для каждой квартиры и вызывать диалог для одной. Можно создать список как например, на картинке ниже — для каждой квартиры своя кнопка.
                Кроме того, можно менять формы, диалоги на свой вкус.
        Владимир
        13 июля 2016, 18:30
        Доброго дня!
        Сергей, возможно ли связывать описания с ресурсами?
        При клике на описание как на этом изображении:
          Сергей Шлоков
          13 июля 2016, 19:56
          На сегодняшний день есть односторонняя связь — при сохранении ресурса в плагине по событию onDocFormSave брать описание из ресурса и сохранять в объект бронирования. А в следующей версии oneBooking я планирую добавить события MODX при создании, изменении и удалении объекта. Таким образом, появится и обратная связь. Это интересовало?
        Андрей
        04 февраля 2018, 14:51
        Добрый день. Можно ли с помощью компонента реализовать почасовое бронирование?
          Сергей Шлоков
          04 февраля 2018, 23:35
          oneBooking — посуточная система бронирования.
            Rrp2010
            04 февраля 2018, 23:43
            Обратите внимание на это дополнение с почасовым бронированием. https://modstore.pro/packages/booking/userevents Использовал в одном проекте, очень понравилось в работе.
            Виталий Барышников
            12 августа 2018, 14:30
            Привет. Подойдет ли компонент для задачи с бронированием мест на определенное мероприятие? Допустим киносеанс или турпоездка. Т.е. есть фиксированное количество мест (без указания конкретного места) в группе и одна определенная дата мероприятия, нужно чтобы было видно сколько есть свободных мест и сколько осталось.
              Сергей Шлоков
              12 августа 2018, 15:39
              Вряд ли. Подход другой. Объект бронирования доступен в любой день. А в твоём случае мероприятие (объект бронирования) доступно только в один конкретный день.
              Michael
              09 декабря 2018, 10:11
              В идеале бы еще добавить ограничения по кол-ву спальных мест.
              Допустим основных мест в жилье = 3 + 1 дополнительное место = 4 гостя. Цена для 3 гостей будет та, которая указана за номер, а при выборе 4-х человек, насчитывать еще фиксированную доп. стоимость за сутки ( допустим + 1000руб или бесплатно на усмотрение хозяина). При попытке забронировать для 5-х гостей не давать им вариантов выбрать больше чем 4 гостя или выводить сообщение типа: «Номер расчитан на 4-х гостей, забронировать 2 номера этой категории для 5-х гостей?».
              Большинство не читают описание на странице номера а посмотрев фотки, сразу идут калькулировать цену, выбирая кол-во гостей в форме, они бронируют с уверенностью что система им сама все предложит и скажет ( это я говорю из опыта, работаю в отеле 60 номеров в Крыму у моря). Потом отель эти погрешности решает и извиняется, типа «На самом деле нельзя было забронировать, номер не рассчитан на 5-х», а вам отвечают: «Ну система ведь дала забронировать и в ручном режиме подбираешь им варианты».

              Еще я бы итоговую стоимость вынес сразу же как только выбираются даты у жилья, чтобы было наглядно видно что сумма скалькулирована, и если цена не подходит то перевыбрать даты или смотреть другой номер сразу на первом шаге.
              Убрал бы иконку калькулятора которую надо догадаться нажать чтобы увидеть сумму.
              Вместо выбора кол-ва номеров ( на первом шаге) сделал бы кол-во гостей, и от выбранного кол-ва гостей, считал стоимость и предлагал кол-во номеров на следующем шаге. Если выбранное пользователем кол-во гостей не превышает указанное кол-во основных мест + доп. мест, то предлагаем 1 номер, если превышает то предлагаем 2.
              Как-то так. Это не более чем рекомендации.
                Michael
                09 декабря 2018, 10:45
                Еще круто было бы вывести отдельно минимальную цену жилья за весь свободный период. Чтобы в номере была актуальная цифра «Цена от 1500руб» и на превью номера.
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  25