This module is seeking new co-maintainers, please chime in if you have time to help push it forwards.
Allocated seating provides two field types - an allocated seating designer and a seating plan.
These fields can be used for various purposes - eg the designer can be used on a node edit form to allow users to create a seating plan for an event whilst the plan can be used as part of a checkout workflow to allow customers to nominate which seat they wish to book.
The seat designer features a drag and drop interface powered by jquery_ui. Users can design their seating plan by nominating the number of tickets and the seating layout (number of rows, columns, sections/floors). Users can drag the seats around to set up their desired layout, including dragging between floors.
This module was originally written for a Transport booking module which is still under active development
How to use
An example of how to add a seating designer to your form:
// Add the necessary js, css and libraries
// Add your field
$form['ticketing']['ticket_plan'] = array(
'#description' => t('Enter the number of rows and columns in your layout. You may drag and drop seats to reorder them. You may add another floor/section/level by clicking add floor. You can drag seats from one floor to another by dropping them on the tab of the floor you wish to drag them to.'),
'#ahah_extra' => 'ticketing/', // This added to the ahah path
'#default_value' => (isset($form_state['values']['ticket_plan']) ? $form_state['values']['ticket_plan'] : $node->ticket_plan),
'#type' => 'allocated_seating_seat_design', // Note the field type
'#seats' => 50 // This is a required property, the designer needs to know how many seats are required - you can make this dynamic if you wish with ahah/use of $form_state
Note the #ahah_extra property is required when you nest your field (as in the example). The fields use ahah to dynamically modify the number of rows/columns/floors. By nominating the parents (imploded with /) the module can accurately traverse the $form array to return the correct element.
To add a seating plan (choose your seat) to your form:
$form['seats'] = array(
'#type' => 'allocated_seating_seat_select', //Note the field type
'#default_value' => $form_state['values']['seats'], //Pre-set the selected seats
'#required_seats' => $form_state['values']['quantity'], //The quantity of seats the user must choose to continue
'#plan' => $form_state['storage']['ticket_plan'], // The ticket plan, this is an array of the form returned from the field type 'allocated_seating_seat_design' - see above
'#not_available' => bookable_instance_get_sold($instance) // An array of seat numbers that are not available (ie already sold)
Note the module comes with a sub-module allocated_seating_example which contains a fully-functional example of how to add a seating plan editor field to a node edit form - see the function allocated_seating_example_node_ticket_layout_form().
There is work underway to bundle this into an event ticketing system for Ubercart.
Some more documentation would probably help.
http://dl.dropbox.com/u/10201421/bookable.ogv (ogv 7.8 Mb)