Last year, I built a site to allow parents to register their children for Catlin Gabel’s summer camps. This helped our small staff more easily handle hundreds of registrations each spring and provides our parents with immediate feedback for their summer plans. This year, I incorporated this into our new website by rebuilding the features using the same technique. The site had to include courses from a print catalog, accept credit card transactions, enforce enrollment limits, record student information, and new this year, require a complete medical release form as part of registration
This technique relies on just four modules: Ubercart, CCK, Views, and Webform, three of which I was already using widely throughout the site. Although I was worried about the increased load of installing Ubercart on our site, I found through testing that RAM use and page load time did not differ significantly between a copy of site that included Ubercart and a copy that did not.
Summer Course is a custom Ubercart product type, which creates a new custom content type to which one may add fields. I added select lists for grade and session (week). I chose not to use taxonomy for this, because I would have more control over the display of CCK fields in the node editing form, and because these value lists only apply to this one content type.
One view presents users with the main list of summer course offerings, offering both a link directly to the detailed course description and a button to purchase immediately if you know already the courses you want to choose. Exposed filters allow one to limit the list to certain grades or weeks. I display the Ubercart-supplied shopping cart block on this page.
The cart and checkout processes are very standard. Users review their cart and then move to complete checkout. I bought a monthly subscription to PayPal Website Payments Pro, so that our website could send purchase information directly to PayPal and receive an immediately reply, without the user leaving our site. We use PayPal’s admin interface to transfer funds to the school’s bank account and issue refunds. As an added benefit, we do not store any credit card information on our servers. In order to make another feature possible (see below), I require the user to log in to access checkout.
I combined student information and medical release into one form. I could have built the form in a custom module, but I chose to use Webform in order to save time and make it easier for others to modify the form in the future. I route parents from the Ubercart screen to the webform and then route them back to checkout by setting the webform’s “thank you” page to /cart/checkout.
I wrote a custom Ubercart module to add a “student information and medical release” panel to the checkout screen. This is done by invoking hook_checkout_pane in my module. To require the completion of this form, my custom pane creates a select list showing all of the medical release webforms that the user has created on the site. Since the medical form also contains the student information, the user has to complete one for each student she wishes to register. Completing the form makes student names appear in the required select field.
The custom module saves the submitted webform id in a custom database table, linking each course registration to a specified student. A couple more custom functions hook into the checkout review and invoice panes, displaying the student’s information through the rest of the checkout and confirmation process.
A second custom module allows our staff to export orders from the system for reconciliation with any paper orders received and the billing process. I prefer not to have the website handle too many of the back-office functions of the program, since it would take so much additional effort to include accounting reconciliation and other administrative features that only a few school staff members will use. The website is primarily for the many end-users who will sign up for courses.
The Ubercart “stock” feature allows us to limit online enrollment for popular classes, so that the website does not unwittingly facilitate over-subscription.
A little CSS and theme work lines up the Grades field values in a row and arranges some webform sections side-by-side.
Ubercart offers just about everything we need out of the box, provides a framework for adding some features, and keeps this important tool within our main website.