/** * 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(); }