/**
  * Setup the CMS Fields for the User Defined Form
  * 
  * @return FieldSet
  */
 public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     // define tabs
     $fields->findOrMakeTab('Root.Form', _t('UserDefinedForm.FORM', 'Form'));
     $fields->findOrMakeTab('Root.Options', _t('UserDefinedForm.OPTIONS', 'Options'));
     $fields->findOrMakeTab('Root.EmailRecipients', _t('UserDefinedForm.EMAILRECIPIENTS', 'Email Recipients'));
     $fields->findOrMakeTab('Root.OnComplete', _t('UserDefinedForm.ONCOMPLETE', 'On Complete'));
     $fields->findOrMakeTab('Root.Submissions', _t('UserDefinedForm.SUBMISSIONS', 'Submissions'));
     // field editor
     $fields->addFieldToTab("Root.Form", new FieldEditor("Fields", 'Fields', "", $this));
     // view the submissions
     $fields->addFieldToTab("Root.Submissions", new CheckboxField('DisableSaveSubmissions', _t('UserDefinedForm.SAVESUBMISSIONS', "Disable Saving Submissions to Server")));
     $fields->addFieldToTab("Root.Submissions", new SubmittedFormReportField("Reports", _t('UserDefinedForm.RECEIVED', 'Received Submissions'), "", $this));
     UserDefinedForm_EmailRecipient::$summary_fields = array('EmailAddress' => _t('UserDefinedForm.EMAILADDRESS', 'Email'), 'EmailSubject' => _t('UserDefinedForm.EMAILSUBJECT', 'Subject'), 'EmailFrom' => _t('UserDefinedForm.EMAILFROM', 'From'));
     // who do we email on submission
     $emailRecipients = new GridField("EmailRecipients", "EmailRecipients", $this->EmailRecipients(), GridFieldConfig_RecordEditor::create(10));
     $fields->addFieldToTab("Root.EmailRecipients", $emailRecipients);
     // text to show on complete
     $onCompleteFieldSet = new FieldList($editor = new HtmlEditorField("OnCompleteMessage", _t('UserDefinedForm.ONCOMPLETELABEL', 'Show on completion'), _t('UserDefinedForm.ONCOMPLETEMESSAGE', $this->OnCompleteMessage)));
     $editor->setRows(3);
     $fields->addFieldsToTab("Root.OnComplete", $onCompleteFieldSet);
     $fields->addFieldsToTab("Root.Options", $this->getFormOptions());
     return $fields;
 }
 /**
  * @return string
  */
 public function getEmailBodyContent()
 {
     $replaceFrom = array();
     $replaceTo = array();
     foreach ($this->EmailBodyVariables() as $varname => $value) {
         $replaceFrom[] = $varname;
         $replaceTo[] = $value;
     }
     return str_replace($replaceFrom, $replaceTo, parent::getEmailBodyContent());
 }
 function testEmailRecipientPopup()
 {
     $this->logInWithPermission('ADMIN');
     $form = $this->objFromFixture('UserDefinedForm', 'basic-form-page');
     $popup = new UserDefinedForm_EmailRecipient();
     $fields = $popup->getCMSFields();
     $this->assertTrue($fields->dataFieldByName('EmailSubject') !== null);
     $this->assertTrue($fields->dataFieldByName('EmailFrom') !== null);
     $this->assertTrue($fields->dataFieldByName('EmailAddress') !== null);
     $this->assertTrue($fields->dataFieldByName('HideFormData') !== null);
     $this->assertTrue($fields->dataFieldByName('SendPlain') !== null);
     $this->assertTrue($fields->dataFieldByName('EmailBody') !== null);
     // add an email field, it should now add a or from X address picker
     $email = $this->objFromFixture('EditableEmailField', 'email-field');
     $form->Fields()->add($email);
     $popup->FormID = $form->ID;
     $popup->write();
     $fields = $popup->getCMSFields();
     $this->assertThat($fields->fieldByName('SendEmailToFieldID'), $this->isInstanceOf('DropdownField'));
     // if the front end has checkboxs or dropdown they can select from that can also be used to send things
     $dropdown = $this->objFromFixture('EditableDropdown', 'department-dropdown');
     $form->Fields()->add($dropdown);
     $fields = $popup->getCMSFields();
     $this->assertTrue($fields->dataFieldByName('SendEmailToFieldID') !== null);
     $popup->delete();
 }
 /**
  * Run the update.
  *
  * Things it needs to do:
  * 		- Port the Settings on Individual Fields
  *		- Create the new class for multiple options
  *		- Port Email To to New Email_Recipients
  * 
  * @param HTTPRequest
  */
 function run($request)
 {
     // load the forms
     $forms = DataObject::get('UserDefinedForm');
     if (!$forms) {
         $forms = new DataObjectSet();
     }
     // set debugging / useful test
     $this->dryRun = isset($_GET['dryRun']) ? true : false;
     if ($this->dryRun) {
         echo "Will be running this test as a dry run. No data will be added or removed.<br />";
     }
     // if they want to import just 1 form - eg for testing
     if (isset($_GET['formID'])) {
         $id = Convert::raw2sql($_GET['formID']);
         $forms->push(DataObject::get_by_id('UserDefinedForm', $id));
     }
     if (!$forms) {
         echo "No UserForms Found on Database";
         return;
     }
     echo "Proceeding to update " . $forms->Count() . " Forms<br />";
     foreach ($forms as $form) {
         echo " -- Updating  {$form->URLSegment} <br />";
         // easy step first port over email data from the structure
         if ($form->EmailOnSubmit && $form->EmailTo) {
             // EmailTo can be a comma separated list so we need to explode that
             $emails = explode(",", $form->EmailTo);
             if ($emails) {
                 foreach ($emails as $email) {
                     $emailTo = new UserDefinedForm_EmailRecipient();
                     $emailTo->EmailAddress = trim($email);
                     $emailTo->EmailSubject = $form ? $form->Title : _t('UserFormsMigrationTask.DEFAULTSUBMISSIONTITLE', "Submission Data");
                     $emailTo->EmailFrom = Email::getAdminEmail();
                     $emailTo->FormID = $form->ID;
                     echo " -- -- Created new Email Recipient  {$email}<br />";
                     if (!$this->dryRun) {
                         $emailTo->write();
                     }
                 }
             }
         }
         // now fix all the fields
         if ($form->Fields()) {
             foreach ($form->Fields() as $field) {
                 switch ($field->ClassName) {
                     case 'EditableDropdown':
                     case 'EditableRadioField':
                     case 'EditableCheckboxGroupField':
                         $optionClass = "EditableDropdownOption";
                         if ($field->ClassName == "EditableRadioField") {
                             $optionClass = "EditableRadioOption";
                         } else {
                             if ($field->ClassName == "EditableCheckboxGroupField") {
                                 $optionClass = "EditableCheckboxOption";
                             }
                         }
                         $query = DB::query("SELECT * FROM \"{$optionClass}\" WHERE \"ParentID\" = '{$field->ID}'");
                         $result = $query->first();
                         if ($result) {
                             do {
                                 $this->createOption($result, $optionClass);
                             } while ($result = $query->next());
                         }
                         break;
                     case 'EditableTextField':
                         $database = $this->findDatabaseTableName('EditableTextField');
                         // get the data from the table
                         $result = DB::query("SELECT * FROM \"{$database}\" WHERE \"ID\" = {$field->ID}")->first();
                         if ($result) {
                             $field->setSettings(array('Size' => $result['Size'], 'MinLength' => $result['MinLength'], 'MaxLength' => $result['MaxLength'], 'Rows' => $result['Rows']));
                         }
                         break;
                     case 'EditableLiteralField':
                         if ($field->Content) {
                             // find what table to use
                             $database = $this->findDatabaseTableName('EditableLiteralField');
                             // get the data from the table
                             $result = DB::query("SELECT * FROM \"{$database}\" WHERE \"ID\" = {$field->ID}")->first();
                             if ($result) {
                                 $field->setSettings(array('Content' => $result['Content']));
                             }
                         }
                         break;
                     case 'EditableMemberListField':
                         if ($field->GroupID) {
                             // find what table to use
                             $database = $this->findDatabaseTableName('EditableMemberListField');
                             // get the data from the table
                             $result = DB::query("SELECT * FROM \"{$database}\" WHERE \"ID\" = {$field->ID}")->first();
                             if ($result) {
                                 $field->setSettings(array('GroupID' => $result['GroupID']));
                             }
                         }
                         break;
                     case 'EditableCheckbox':
                         if ($field->Checked) {
                             // find what table to use
                             $database = $this->findDatabaseTableName('EditableCheckbox');
                             // get the data from the table
                             $result = DB::query("SELECT * FROM \"{$database}\" WHERE \"ID\" = {$field->ID}")->first();
                             if ($result) {
                                 $field->setSettings(array('Default' => $result['Checked']));
                             }
                         }
                         break;
                     case 'EditableEmailField':
                         $database = $this->findDatabaseTableName('EditableEmailField');
                         $result = DB::query("SELECT * FROM \"{$database}\" WHERE \"ID\" = {$field->ID}")->first();
                         if ($result && isset($result['SendCopy']) && $result['SendCopy'] == true) {
                             // we do not store send copy on email field anymore. This has been wrapped into
                             // the email recipients
                             $emailTo = new UserDefinedForm_EmailRecipient();
                             $emailTo->EmailSubject = $form ? $form->Title : _t('UserFormsMigrationTask.DEFAULTSUBMISSIONTITLE', "Submission Data");
                             $emailTo->EmailFrom = Email::getAdminEmail();
                             $emailTo->FormID = $form->ID;
                             $emailTo->SendEmailToFieldID = $field->ID;
                             $emailTo->EmailBody = $form->EmailMessageToSubmitter;
                             if (!$this->dryRun) {
                                 $emailTo->write();
                             }
                         }
                         break;
                 }
                 if (!$this->dryRun) {
                     $field->write();
                 }
             }
         }
     }
     echo "<h3>Migration Complete</h3>";
 }
 function testEmailTemplateExists()
 {
     $recipient = new UserDefinedForm_EmailRecipient();
     // Set the default template
     $recipient->EmailTemplate = current(array_keys($recipient->getEmailTemplateDropdownValues()));
     $recipient->write();
     // The default template exists
     $this->assertTrue($recipient->emailTemplateExists());
     // A made up template doesn't exists
     $this->assertFalse($recipient->emailTemplateExists('MyTemplateThatsNotThere'));
     $recipient->delete();
 }