Source of file EventRegisterTicketsStep.php
Size: 4,032 Bytes - Last Modified: 2021-12-23T10:48:15+00:00
/var/www/docs.ssmods.com/process/src/code/forms/EventRegisterTicketsStep.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 | <?php /** * A form step that gets the user to select the tickets they wish to purchase, * as well as enter their details. * * @package silverstripe-eventmanagement */ class EventRegisterTicketsStep extends MultiFormStep { public function getTitle() { return 'Event Tickets'; } /** * @return string */ public function getNextStep() { if ($this->getTotal()->getAmount() > 0) { return 'EventRegisterPaymentStep'; } else { return 'EventRegisterFreeConfirmationStep'; } } public function loadData() { $data = parent::loadData(); if ($member = Member::currentUser()) { $data['Name'] = $member->Name; $data['Email'] = $member->Email; } return $data; } /** * Returns the total sum of all the tickets the user is purchasing. * * @return Money */ public function getTotal() { $amount = 0; $currency = null; $data = $this->loadData(); if (isset($data['Tickets'])) { foreach ($data['Tickets'] as $id => $quantity) { $ticket = DataObject::get_by_id('EventTicket', $id); $price = $ticket->obj('Price'); if ($ticket->Type == 'Free' || !$quantity) { continue; } $amount += $price->getAmount() * $quantity; $currency = $price->getCurrency(); } } return DBField::create_field('Money', array( 'Amount' => $amount, 'Currency' => $currency )); } public function getFields() { $datetime = $this->getForm()->getController()->getDateTime(); $session = $this->getForm()->getSession(); $fields = new FieldList( $tickets = new EventRegistrationTicketsTableField('Tickets', $datetime) ); $tickets->setExcludedRegistrationId($session->RegistrationID); if ($member = Member::currentUser()) { $fields->push(new ReadonlyField('Name', 'Your name')); $fields->push(new ReadonlyField('Email', 'Email address')); } else { $fields->push(new TextField('Name', 'Your name')); $fields->push(new EmailField('Email', 'Email address')); } $this->extend('updateFields', $fields); return $fields; } public function getValidator() { if ($member = Member::currentUser()) { $validator = new RequiredFields(); } else { $validator = new RequiredFields('Name', 'Email'); } $this->extend('updateValidator', $validator); return $validator; } public function validateStep($data, $form) { Session::set("FormInfo.{$form->FormName()}.data", $form->getData()); $datetime = $this->getForm()->getController()->getDateTime(); $data = $form->getData(); if ($datetime->Event()->OneRegPerEmail) { if (Member::currentUserID()) { $email = Member::currentUser()->Email; } else { $email = $data['Email']; } $existing = DataObject::get_one('EventRegistration', sprintf( '"Email" = \'%s\' AND "Status" <> \'Canceled\' AND "TimeID" = %d', Convert::raw2sql($email), $datetime->ID )); if ($existing) { $form->addErrorMessage( 'Email', 'A registration for this email address already exists', 'required'); return false; } } // Ensure that the entered ticket data is valid. if (!$this->form->validateTickets($data['Tickets'], $form)) { return false; } // Finally add the tickets to the actual registration. $registration = $this->form->getSession()->getRegistration(); $form->saveInto($registration); if ($member = Member::currentUser()) { $registration->Name = $member->getName(); $registration->Email = $member->Email; } else { $registration->Name = $data['Name']; $registration->Email = $data['Email']; } $registration->TimeID = $datetime->ID; $registration->MemberID = Member::currentUserID(); $total = $this->getTotal(); $registration->Total->setCurrency($total->getCurrency()); $registration->Total->setAmount($total->getAmount()); $registration->write(); $registration->Tickets()->removeAll(); foreach ($data['Tickets'] as $id => $quantity) { if ($quantity) { $registration->Tickets()->add($id, array('Quantity' => $quantity)); } } return true; } } |