A cross-surface booking cart: whatever surface (the calendar, the seat map) fills the session basket, one cart page reviews it and checks out, starting one workflow for the whole order.
New yoyaku_cart module (core-only dependency):
- BasketSummary: the session order as events, each with its priced tickets (a ticket per line, seat or places, priced when yoyaku_payment is installed).
- CartForm at /booking/cart: event cards with numbered ticket rows, a per-ticket Remove, and a Checkout button.
- CartCheckoutEvent: the seam. Checkout dispatches it; a consumer redirects where the order goes next. The cart knows nothing of workflows.
- hook_yoyaku_cart_line_alter(): the extension point. A ticket starts as a plain places line; the module owning the line names it. yoyaku_seating labels a seated line with its seat, with no dependency either way.
yoyaku_cart_orchestra submodule: a CartCheckoutEvent subscriber that starts the order workflow (WorkflowStarter) and redirects to its first interaction step. Named _orchestra, not _interaction, as it implements no interaction component.
Also: BookingCart::releaseLine() for per-line removal, and yoyaku_seating contributes seat labels via the hook. Kernel-tested (summary shape, the describe hook, releaseLine). Surface wiring (links from the slot and seating pages, dropping the per-slot checkout button) is a follow-up.
Issue fork yoyaku-3611985
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
mably commentedComment #5
mably commented