function __construct($controller, $name, PresentationSpeakerSummitAssistanceConfirmationRequest $request)
 {
     $PhoneField = new TextField('OnSitePhoneNumber', 'Your OnSite Phone Number for ' . $request->Summit()->Title . ':');
     $RegisteredField = new CheckboxField('RegisteredForSummit', 'I have registered for the summit using the confirmation code sent in the email.');
     $SpeakerHashField = new HiddenField('RequestID', "RequestID", $request->ID);
     $fields = new FieldList($PhoneField, $RegisteredField, $SpeakerHashField);
     $submitButton = new FormAction('doSavePhoneNumber', 'Save');
     $actions = new FieldList($submitButton);
     $validator = new RequiredFields('OnSitePhoneNumber');
     parent::__construct($controller, $name, $fields, $actions, $validator);
 }
    function doUp()
    {
        global $database;
        if (DBSchema::existsColumn($database, 'PresentationSpeaker', 'OnSitePhoneNumber')) {
            $speakers_info_query = <<<SQL
SELECT ID, OnSitePhoneNumber, ConfirmedDate, RegisteredForSummit
FROM PresentationSpeaker where OnSitePhoneNumber IS NOT NULL;
SQL;
            $res = DB::query($speakers_info_query);
            foreach ($res as $row) {
                $speaker_id = intval($row['ID']);
                $on_site_phone = intval($row['OnSitePhoneNumber']);
                $confirmed_date = $row['ConfirmedDate'];
                $registered = (bool) $row['RegisteredForSummit'];
                $speaker = PresentationSpeaker::get()->byID($speaker_id);
                if (is_null($speaker)) {
                    continue;
                }
                if (PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(array('SummitID' => 5, 'SpeakerID' => $speaker_id))->count() > 0) {
                    continue;
                }
                $assistance = PresentationSpeakerSummitAssistanceConfirmationRequest::create();
                $assistance->SpeakerID = $speaker_id;
                $assistance->SummitID = 5;
                $assistance->OnSitePhoneNumber = $on_site_phone;
                $assistance->ConfirmationDate = $confirmed_date;
                $assistance->RegisteredForSummit = $registered;
                $assistance->IsConfirmed = true;
                $assistance->write();
            }
            DBSchema::dropColumn($database, 'PresentationSpeaker', 'OnSitePhoneNumber');
            DBSchema::dropColumn($database, 'PresentationSpeaker', 'ConfirmedDate');
            DBSchema::dropColumn($database, 'PresentationSpeaker', 'RegisteredForSummit');
        }
    }
 public function confirm()
 {
     parent::init();
     try {
         $token = Session::get('SummitConfirmSpeakerPage.Token');
         if (isset($_REQUEST['t'])) {
             $token = base64_decode($_REQUEST['t']);
             Session::set('SummitConfirmSpeakerPage.Token', $token);
             return $this->redirect($this->Link('confirm'));
         }
         if (empty($token)) {
             throw new InvalidArgumentException('missing token!');
         }
         $request = PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter('ConfirmationHash', PresentationSpeakerSummitAssistanceConfirmationRequest::HashConfirmationToken($token))->first();
         if (is_null($request)) {
             throw new NotFoundEntityException('PresentationSpeakerSummitAssistanceConfirmationRequest', '');
         }
         if (!$request->alreadyConfirmed()) {
             $request->confirm($token);
             $request->write();
         }
         $data['Speaker'] = $request->Speaker();
         $data['Summit'] = $request->Summit();
         Session::set('Current.PresentationSpeakerSummitAssistanceConfirmationRequest', $request);
         return $this->customise($data)->renderWith(array('SummitConfirmSpeakerPage', 'SummitPage'), $this->parent);
     } catch (Exception $ex) {
         SS_Log::log($ex->getMessage(), SS_Log::WARN);
         return $this->httpError(404, 'Sorry, this speaker confirmation token does not seem to be correct.');
     }
 }
 /**
  * Resets the confirmation request if exists and its not confirmed yet
  * otherwise exception
  * @param int $summit_id
  * @return string
  * @throws Exception
  * @throws ValidationException
  * @throws null
  */
 public function resetConfirmationLink($summit_id)
 {
     $confirmation_page = SummitConfirmSpeakerPage::get()->filter('SummitID', intval($summit_id))->first();
     if (!$confirmation_page) {
         throw new NotFoundEntityException('Confirmation Speaker Page not set on current summit!');
     }
     $url = $confirmation_page->getAbsoluteLiveLink(false);
     $request = PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(['SummitID' => intval($summit_id), 'SpeakerID' => $this->ID])->first();
     if (is_null($request)) {
         throw new EntityValidationException('there is not valid request!');
     }
     if ($request->alreadyConfirmed()) {
         throw new EntityValidationException('request already confirmed!');
     }
     $token = null;
     $already_exists = false;
     do {
         $token = $request->generateConfirmationToken();
         $already_exists = intval(PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(['SummitID' => intval($summit_id), 'SpeakerID:ExactMatch:not' => $this->ID, 'ConfirmationHash' => PresentationSpeakerSummitAssistanceConfirmationRequest::HashConfirmationToken($token)])->count()) > 1;
     } while ($already_exists);
     $request->write();
     return $url . 'confirm?t=' . base64_encode($token);
 }