[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
2 553
+7
Поблагодарить автора Отправить деньги

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

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

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

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

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