Зал: выбор мест

Схема зала, в которой посетитель выбирает места пальцем: кино, театр, площадка.

Зал описывается строками, а выбранные места запоминаются списком.
Зал описывается строками, а выбранные места запоминаются списком.

Блок «Зал» рисует схему кресел и даёт посетителю выбрать места нажатием. Собирать его из кнопок не нужно: ряд на четырнадцать мест — это четырнадцать кнопок с четырнадцатью действиями, а зал на сто мест после этого нельзя поправить.

Зал описывается текстом — строка на ряд. Это же и есть способ нарисовать проходы и назначить цены:

Партер
A: 1-12
B: 1-6, 8-14
C: 1-10 11-20 (800, VIP)
  • Метка ряда — до двоеточия. Что угодно: A, 1, Балкон.
  • Пропущенный номер — это проход. В B: 1-6, 8-14 на месте седьмого будет дыра: проход задаётся той же нумерацией, которая у зала и так есть.
  • Разрыв без запятой — тоже проход. C: 1-10 11-20 ставит проход посередине, хотя нумерация сплошная и дыру взять неоткуда. Так же читаются 1-10 | 11-20 и [1-10][11-20], и проходов в ряду может быть сколько угодно. Запомнить надо одно: запятая ряд продолжает, всё остальное — разрывает.
  • Сколько пробелов — столько пустых мест. C: 1-10 11-20 — проход шириной в три кресла. Так проход из одного ряда встаёт на ту же вертикаль, что и в соседнем: зал с широким проходом посередине пишется пробелами, а не подгонкой номеров. Со знаком (|, /, []) проход остаётся в одну клетку — пробелы вокруг знака считаются оформлением.
  • Пустая строка — поперечный проход между блоками рядов.
  • Строка без двоеточия — заголовок сектора: Партер, Балкон, Амфитеатр. Подпись встаёт поперёк зала над своими рядами.
  • В скобках — цена и категория: (800), (800, VIP). Цена стоит у ряда — значит и «ряды по разной цене» пишутся здесь же: 1: 1-20 (2000), 2: 1-20 (1500). Цена нужна, чтобы выбранные места складывались в сумму сами.

Зал шире экрана телефона возят пальцем вбок, а открывается он серединой, а не левым краем. Если мест много, кресла ужимаются и номера на них пропадают — тогда над залом появляются «+» и «−», и то же самое делает щипок двумя пальцами: приблизили — номера вернулись. Метки рядов при этом держатся у краёв экрана и уезжать вместе с залом не умеют, так что ряд видно всегда. Кнопки можно убрать: «Вид» → «Кнопки масштаба».

Выбранные места ложатся в список в памяти приложения — тот же, с которым работает корзина. Поэтому «Итого», форма заявки и оплата читают их без единой настройки: {{seats.count}} — сколько мест, {{seats.sum.price}} — на какую сумму, {{seats.join.code}} — сами места одной строкой, «A-5, A-6».

Занятые места зал берёт из таблицы: укажите её в «Какие места уже заняты», назовите столбец с кодом места и — если в таблице лежат билеты на все сеансы сразу — отбор по сеансу. Отбор пишется так же, как у списка. В столбце может лежать и несколько мест через запятую: заказ на три кресла — это одна строка.

Рядом с отбором стоит «Не продавать место дважды». Включите — и одно кресло на один сеанс достанется тому, кто нажал первым: сервер занимает места вместе с заявкой, а второму отвечает отказом и называет занятые кресла. На схеме они у него перекрашиваются в занятые сразу, и из выбранного пропадают сами — считать заново «Итого» не нужно.

Если за место платят внутри приложения, поставьте рядом «Держать место до оплаты, мин» — 10–20 обычно достаточно. Тогда бронь получает срок: не оплатили — кресло вернулось в зал само, и разбирать брошенные заявки руками не нужно. Оплата снимает срок совсем: заказ становится билетом, и место закреплено навсегда. Отменённый платёж возвращает кресло сразу, не дожидаясь конца срока.

Пока бронь ждёт оплаты, у её строки есть {{item.__holdUntil}} — момент, до которого место закреплено. Из него получается честная строка на экране оплаты: «Держим места до 19:45».

Несколько залов — одна схема на зал. Над текстом зала переключатель «Своя схема / Из таблицы». Заведите таблицу «Залы» со столбцом типа «Схема зала», у сеансов — связь с залом, а выбранный сеанс запоминайте переменной «строка из таблицы». В режиме «Из таблицы» панель сама предложит путь к схеме — например «session → Зал → Схема», то есть {{session.hall.layout}}, — и покажет, на сколько мест рисуется зал. Занятые места отбирайте по тому же сеансу: столбец «Сеанс» в билетах и значение {{session.id}}.

Где: Палитра блоков → «Коммерция» → «Зал». Готовый экран целиком — «Экраны» → «Выбор мест»: в нём уже связаны «Залы», «Сеансы» и «Билеты», и выбор сеанса меняет зал.

Читать дальше