diff --git a/code/extensions/SecureEditableFileField.php b/code/Extension/SecureEditableFileField.php
similarity index 100%
rename from code/extensions/SecureEditableFileField.php
rename to code/Extension/SecureEditableFileField.php
diff --git a/code/extensions/UserFormFieldEditorExtension.php b/code/Extension/UserFormFieldEditorExtension.php
similarity index 100%
rename from code/extensions/UserFormFieldEditorExtension.php
rename to code/Extension/UserFormFieldEditorExtension.php
diff --git a/code/extensions/UserFormValidator.php b/code/Extension/UserFormValidator.php
similarity index 100%
rename from code/extensions/UserFormValidator.php
rename to code/Extension/UserFormValidator.php
diff --git a/code/forms/GridFieldAddClassesButton.php b/code/Form/GridFieldAddClassesButton.php
similarity index 100%
rename from code/forms/GridFieldAddClassesButton.php
rename to code/Form/GridFieldAddClassesButton.php
diff --git a/code/forms/UserForm.php b/code/Form/UserForm.php
similarity index 100%
rename from code/forms/UserForm.php
rename to code/Form/UserForm.php
diff --git a/code/UserFormsGridFieldFilterHeader.php b/code/Form/UserFormsGridFieldFilterHeader.php
similarity index 100%
rename from code/UserFormsGridFieldFilterHeader.php
rename to code/Form/UserFormsGridFieldFilterHeader.php
diff --git a/code/formfields/UserFormsCheckboxSetField.php b/code/FormField/UserFormsCheckboxSetField.php
similarity index 100%
rename from code/formfields/UserFormsCheckboxSetField.php
rename to code/FormField/UserFormsCheckboxSetField.php
diff --git a/code/formfields/UserFormsCompositeField.php b/code/FormField/UserFormsCompositeField.php
similarity index 100%
rename from code/formfields/UserFormsCompositeField.php
rename to code/FormField/UserFormsCompositeField.php
diff --git a/code/formfields/UserFormsFieldContainer.php b/code/FormField/UserFormsFieldContainer.php
similarity index 100%
rename from code/formfields/UserFormsFieldContainer.php
rename to code/FormField/UserFormsFieldContainer.php
diff --git a/code/formfields/UserFormsFieldList.php b/code/FormField/UserFormsFieldList.php
similarity index 100%
rename from code/formfields/UserFormsFieldList.php
rename to code/FormField/UserFormsFieldList.php
diff --git a/code/formfields/UserFormsGroupField.php b/code/FormField/UserFormsGroupField.php
similarity index 100%
rename from code/formfields/UserFormsGroupField.php
rename to code/FormField/UserFormsGroupField.php
diff --git a/code/formfields/UserFormsStepField.php b/code/FormField/UserFormsStepField.php
similarity index 100%
rename from code/formfields/UserFormsStepField.php
rename to code/FormField/UserFormsStepField.php
diff --git a/code/formfields/UserformsTreeDropdownField.php b/code/FormField/UserformsTreeDropdownField.php
similarity index 100%
rename from code/formfields/UserformsTreeDropdownField.php
rename to code/FormField/UserformsTreeDropdownField.php
diff --git a/code/model/EditableCustomRule.php b/code/Model/EditableCustomRule.php
similarity index 100%
rename from code/model/EditableCustomRule.php
rename to code/Model/EditableCustomRule.php
diff --git a/code/model/editableformfields/EditableCheckbox.php b/code/Model/EditableFormField/EditableCheckbox.php
similarity index 100%
rename from code/model/editableformfields/EditableCheckbox.php
rename to code/Model/EditableFormField/EditableCheckbox.php
diff --git a/code/model/editableformfields/EditableCheckboxGroupField.php b/code/Model/EditableFormField/EditableCheckboxGroupField.php
similarity index 100%
rename from code/model/editableformfields/EditableCheckboxGroupField.php
rename to code/Model/EditableFormField/EditableCheckboxGroupField.php
diff --git a/code/model/editableformfields/EditableCountryDropdownField.php b/code/Model/EditableFormField/EditableCountryDropdownField.php
similarity index 100%
rename from code/model/editableformfields/EditableCountryDropdownField.php
rename to code/Model/EditableFormField/EditableCountryDropdownField.php
diff --git a/code/model/editableformfields/EditableDateField.php b/code/Model/EditableFormField/EditableDateField.php
similarity index 100%
rename from code/model/editableformfields/EditableDateField.php
rename to code/Model/EditableFormField/EditableDateField.php
diff --git a/code/model/editableformfields/EditableDropdown.php b/code/Model/EditableFormField/EditableDropdown.php
similarity index 100%
rename from code/model/editableformfields/EditableDropdown.php
rename to code/Model/EditableFormField/EditableDropdown.php
diff --git a/code/model/editableformfields/EditableEmailField.php b/code/Model/EditableFormField/EditableEmailField.php
similarity index 100%
rename from code/model/editableformfields/EditableEmailField.php
rename to code/Model/EditableFormField/EditableEmailField.php
diff --git a/code/model/editableformfields/EditableFieldGroup.php b/code/Model/EditableFormField/EditableFieldGroup.php
similarity index 100%
rename from code/model/editableformfields/EditableFieldGroup.php
rename to code/Model/EditableFormField/EditableFieldGroup.php
diff --git a/code/model/editableformfields/EditableFieldGroupEnd.php b/code/Model/EditableFormField/EditableFieldGroupEnd.php
similarity index 100%
rename from code/model/editableformfields/EditableFieldGroupEnd.php
rename to code/Model/EditableFormField/EditableFieldGroupEnd.php
diff --git a/code/model/editableformfields/EditableFileField.php b/code/Model/EditableFormField/EditableFileField.php
similarity index 100%
rename from code/model/editableformfields/EditableFileField.php
rename to code/Model/EditableFormField/EditableFileField.php
diff --git a/code/model/editableformfields/EditableFormField.php b/code/Model/EditableFormField/EditableFormField.php
similarity index 100%
rename from code/model/editableformfields/EditableFormField.php
rename to code/Model/EditableFormField/EditableFormField.php
diff --git a/code/model/editableformfields/EditableFormFieldValidator.php b/code/Model/EditableFormField/EditableFormFieldValidator.php
similarity index 100%
rename from code/model/editableformfields/EditableFormFieldValidator.php
rename to code/Model/EditableFormField/EditableFormFieldValidator.php
diff --git a/code/model/editableformfields/EditableFormHeading.php b/code/Model/EditableFormField/EditableFormHeading.php
similarity index 100%
rename from code/model/editableformfields/EditableFormHeading.php
rename to code/Model/EditableFormField/EditableFormHeading.php
diff --git a/code/model/editableformfields/EditableFormStep.php b/code/Model/EditableFormField/EditableFormStep.php
similarity index 100%
rename from code/model/editableformfields/EditableFormStep.php
rename to code/Model/EditableFormField/EditableFormStep.php
diff --git a/code/model/editableformfields/EditableLiteralField.php b/code/Model/EditableFormField/EditableLiteralField.php
similarity index 100%
rename from code/model/editableformfields/EditableLiteralField.php
rename to code/Model/EditableFormField/EditableLiteralField.php
diff --git a/code/model/editableformfields/EditableMemberListField.php b/code/Model/EditableFormField/EditableMemberListField.php
similarity index 100%
rename from code/model/editableformfields/EditableMemberListField.php
rename to code/Model/EditableFormField/EditableMemberListField.php
diff --git a/code/model/editableformfields/EditableMultipleOptionField.php b/code/Model/EditableFormField/EditableMultipleOptionField.php
similarity index 100%
rename from code/model/editableformfields/EditableMultipleOptionField.php
rename to code/Model/EditableFormField/EditableMultipleOptionField.php
diff --git a/code/model/editableformfields/EditableNumericField.php b/code/Model/EditableFormField/EditableNumericField.php
similarity index 100%
rename from code/model/editableformfields/EditableNumericField.php
rename to code/Model/EditableFormField/EditableNumericField.php
diff --git a/code/model/editableformfields/EditableOption.php b/code/Model/EditableFormField/EditableOption.php
similarity index 100%
rename from code/model/editableformfields/EditableOption.php
rename to code/Model/EditableFormField/EditableOption.php
diff --git a/code/model/editableformfields/EditableRadioField.php b/code/Model/EditableFormField/EditableRadioField.php
similarity index 100%
rename from code/model/editableformfields/EditableRadioField.php
rename to code/Model/EditableFormField/EditableRadioField.php
diff --git a/code/model/editableformfields/EditableTextField.php b/code/Model/EditableFormField/EditableTextField.php
similarity index 100%
rename from code/model/editableformfields/EditableTextField.php
rename to code/Model/EditableFormField/EditableTextField.php
diff --git a/code/model/recipients/UserDefinedForm_EmailRecipient.php b/code/Model/Recipient/UserDefinedForm_EmailRecipient.php
similarity index 100%
rename from code/model/recipients/UserDefinedForm_EmailRecipient.php
rename to code/Model/Recipient/UserDefinedForm_EmailRecipient.php
diff --git a/code/model/recipients/UserDefinedForm_EmailRecipientCondition.php b/code/Model/Recipient/UserDefinedForm_EmailRecipientCondition.php
similarity index 100%
rename from code/model/recipients/UserDefinedForm_EmailRecipientCondition.php
rename to code/Model/Recipient/UserDefinedForm_EmailRecipientCondition.php
diff --git a/code/model/recipients/UserFormRecipientEmail.php b/code/Model/Recipient/UserFormRecipientEmail.php
similarity index 100%
rename from code/model/recipients/UserFormRecipientEmail.php
rename to code/Model/Recipient/UserFormRecipientEmail.php
diff --git a/code/model/recipients/UserFormRecipientItemRequest.php b/code/Model/Recipient/UserFormRecipientItemRequest.php
similarity index 100%
rename from code/model/recipients/UserFormRecipientItemRequest.php
rename to code/Model/Recipient/UserFormRecipientItemRequest.php
diff --git a/code/model/submissions/SubmittedFileField.php b/code/Model/Submission/SubmittedFileField.php
similarity index 100%
rename from code/model/submissions/SubmittedFileField.php
rename to code/Model/Submission/SubmittedFileField.php
diff --git a/code/model/submissions/SubmittedForm.php b/code/Model/Submission/SubmittedForm.php
similarity index 100%
rename from code/model/submissions/SubmittedForm.php
rename to code/Model/Submission/SubmittedForm.php
diff --git a/code/model/submissions/SubmittedFormField.php b/code/Model/Submission/SubmittedFormField.php
similarity index 100%
rename from code/model/submissions/SubmittedFormField.php
rename to code/Model/Submission/SubmittedFormField.php
diff --git a/code/Model/UserDefinedForm.php b/code/Model/UserDefinedForm.php
new file mode 100755
index 0000000..554b593
--- /dev/null
+++ b/code/Model/UserDefinedForm.php
@@ -0,0 +1,365 @@
+ "Varchar",
+ "ClearButtonText" => "Varchar",
+ "OnCompleteMessage" => "HTMLText",
+ "ShowClearButton" => "Boolean",
+ 'DisableSaveSubmissions' => 'Boolean',
+ 'EnableLiveValidation' => 'Boolean',
+ 'DisplayErrorMessagesAtTop' => 'Boolean',
+ 'DisableAuthenicatedFinishAction' => 'Boolean',
+ 'DisableCsrfSecurityToken' => 'Boolean'
+ );
+
+ /**
+ * @var array Default values of variables when this page is created
+ */
+ private static $defaults = array(
+ 'Content' => '$UserDefinedForm',
+ 'DisableSaveSubmissions' => 0,
+ 'OnCompleteMessage' => '
Thanks, we\'ve received your submission.
'
+ );
+
+ /**
+ * @var array
+ */
+ private static $has_many = array(
+ "Submissions" => "SubmittedForm",
+ "EmailRecipients" => "UserDefinedForm_EmailRecipient"
+ );
+
+ /**
+ * @var array
+ * @config
+ */
+ private static $casting = array(
+ 'ErrorContainerID' => 'Text'
+ );
+
+ /**
+ * Error container selector which matches the element for grouped messages
+ *
+ * @var string
+ * @config
+ */
+ private static $error_container_id = 'error-container';
+
+ /**
+ * The configuration used to determine whether a confirmation message is to
+ * appear when navigating away from a partially completed form.
+ *
+ * @var boolean
+ * @config
+ */
+ private static $enable_are_you_sure = true;
+
+ /**
+ * @var bool
+ * @config
+ */
+ private static $recipients_warning_enabled = false;
+
+ /**
+ * Temporary storage of field ids when the form is duplicated.
+ * Example layout: array('EditableCheckbox3' => 'EditableCheckbox14')
+ * @var array
+ */
+ protected $fieldsFromTo = array();
+
+ /**
+ * @return FieldList
+ */
+ public function getCMSFields()
+ {
+ Requirements::css(USERFORMS_DIR . '/css/UserForm_cms.css');
+
+ $self = $this;
+
+ $this->beforeUpdateCMSFields(function ($fields) use ($self) {
+ // define tabs
+ $fields->findOrMakeTab('Root.FormOptions', _t('UserDefinedForm.CONFIGURATION', 'Configuration'));
+ $fields->findOrMakeTab('Root.Recipients', _t('UserDefinedForm.RECIPIENTS', 'Recipients'));
+ $fields->findOrMakeTab('Root.Submissions', _t('UserDefinedForm.SUBMISSIONS', 'Submissions'));
+
+ // text to show on complete
+ $onCompleteFieldSet = new CompositeField(
+ $label = new LabelField('OnCompleteMessageLabel', _t('UserDefinedForm.ONCOMPLETELABEL', 'Show on completion')),
+ $editor = new HtmlEditorField('OnCompleteMessage', '', _t('UserDefinedForm.ONCOMPLETEMESSAGE', $self->OnCompleteMessage))
+ );
+
+ $onCompleteFieldSet->addExtraClass('field');
+
+ $editor->setRows(3);
+ $label->addExtraClass('left');
+
+ // Define config for email recipients
+ $emailRecipientsConfig = GridFieldConfig_RecordEditor::create(10);
+ $emailRecipientsConfig->getComponentByType('GridFieldAddNewButton')
+ ->setButtonName(
+ _t('UserDefinedForm.ADDEMAILRECIPIENT', 'Add Email Recipient')
+ );
+
+ // who do we email on submission
+ $emailRecipients = new GridField(
+ 'EmailRecipients',
+ _t('UserDefinedForm.EMAILRECIPIENTS', 'Email Recipients'),
+ $self->EmailRecipients(),
+ $emailRecipientsConfig
+ );
+ $emailRecipients
+ ->getConfig()
+ ->getComponentByType('GridFieldDetailForm')
+ ->setItemRequestClass('UserFormRecipientItemRequest');
+
+ $fields->addFieldsToTab('Root.FormOptions', $onCompleteFieldSet);
+ $fields->addFieldToTab('Root.Recipients', $emailRecipients);
+ $fields->addFieldsToTab('Root.FormOptions', $self->getFormOptions());
+
+
+ // view the submissions
+ // make sure a numeric not a empty string is checked against this int column for SQL server
+ $parentID = (!empty($self->ID)) ? (int) $self->ID : 0;
+
+ // get a list of all field names and values used for print and export CSV views of the GridField below.
+ $columnSQL = <<map() as $name => $title) {
+ $columns[$name] = trim(strtr($title, '.', ' '));
+ }
+
+ $config = new GridFieldConfig();
+ $config->addComponent(new GridFieldToolbarHeader());
+ $config->addComponent($sort = new GridFieldSortableHeader());
+ $config->addComponent($filter = new UserFormsGridFieldFilterHeader());
+ $config->addComponent(new GridFieldDataColumns());
+ $config->addComponent(new GridFieldEditButton());
+ $config->addComponent(new GridFieldDeleteAction());
+ $config->addComponent(new GridFieldPageCount('toolbar-header-right'));
+ $config->addComponent($pagination = new GridFieldPaginator(25));
+ $config->addComponent(new GridFieldDetailForm());
+ $config->addComponent(new GridFieldButtonRow('after'));
+ $config->addComponent($export = new GridFieldExportButton('buttons-after-left'));
+ $config->addComponent($print = new GridFieldPrintButton('buttons-after-left'));
+
+ // show user form items in the summary tab
+ $summaryarray = array(
+ 'ID' => 'ID',
+ 'Created' => 'Created',
+ 'LastEdited' => 'Last Edited'
+ );
+ foreach(EditableFormField::get()->filter(array("ParentID" => $parentID)) as $eff) {
+ if($eff->ShowInSummary) {
+ $summaryarray[$eff->Name] = $eff->Title ?: $eff->Name;
+ }
+ }
+
+ $config->getComponentByType('GridFieldDataColumns')->setDisplayFields($summaryarray);
+
+ /**
+ * Support for {@link https://github.com/colymba/GridFieldBulkEditingTools}
+ */
+ if (class_exists('GridFieldBulkManager')) {
+ $config->addComponent(new GridFieldBulkManager());
+ }
+
+ $sort->setThrowExceptionOnBadDataType(false);
+ $filter->setThrowExceptionOnBadDataType(false);
+ $pagination->setThrowExceptionOnBadDataType(false);
+
+ // attach every column to the print view form
+ $columns['Created'] = 'Created';
+ $columns['SubmittedBy.Email'] = 'Submitter';
+ $filter->setColumns($columns);
+
+ // print configuration
+
+ $print->setPrintHasHeader(true);
+ $print->setPrintColumns($columns);
+
+ // export configuration
+ $export->setCsvHasHeader(true);
+ $export->setExportColumns($columns);
+
+ $submissions = GridField::create(
+ 'Submissions',
+ _t('UserDefinedForm.SUBMISSIONS', 'Submissions'),
+ $self->Submissions()->sort('Created', 'DESC'),
+ $config
+ );
+ $fields->addFieldToTab('Root.Submissions', $submissions);
+ $fields->addFieldToTab(
+ 'Root.FormOptions',
+ CheckboxField::create(
+ 'DisableSaveSubmissions',
+ _t('UserDefinedForm.SAVESUBMISSIONS', 'Disable Saving Submissions to Server')
+ )
+ );
+ });
+
+ $fields = parent::getCMSFields();
+
+ if ($this->EmailRecipients()->Count() == 0 && static::config()->recipients_warning_enabled) {
+ $fields->addFieldToTab("Root.Main", new LiteralField("EmailRecipientsWarning",
+ "" . _t("UserDefinedForm.NORECIPIENTS",
+ "Warning: You have not configured any recipients. Form submissions may be missed.")
+ . "
"), "Title");
+ }
+
+ return $fields;
+ }
+
+ /**
+ * Allow overriding the EmailRecipients on a {@link DataExtension}
+ * so you can customise who receives an email.
+ * Converts the RelationList to an ArrayList so that manipulation
+ * of the original source data isn't possible.
+ *
+ * @return ArrayList
+ */
+ public function FilteredEmailRecipients($data = null, $form = null)
+ {
+ $recipients = new ArrayList($this->EmailRecipients()->toArray());
+
+ // Filter by rules
+ $recipients = $recipients->filterByCallback(function ($recipient) use ($data, $form) {
+ /** @var UserDefinedForm_EmailRecipient $recipient */
+ return $recipient->canSend($data, $form);
+ });
+
+ $this->extend('updateFilteredEmailRecipients', $recipients, $data, $form);
+
+ return $recipients;
+ }
+
+ /**
+ * Custom options for the form. You can extend the built in options by
+ * using {@link updateFormOptions()}
+ *
+ * @return FieldList
+ */
+ public function getFormOptions()
+ {
+ $submit = ($this->SubmitButtonText) ? $this->SubmitButtonText : _t('UserDefinedForm.SUBMITBUTTON', 'Submit');
+ $clear = ($this->ClearButtonText) ? $this->ClearButtonText : _t('UserDefinedForm.CLEARBUTTON', 'Clear');
+
+ $options = new FieldList(
+ new TextField("SubmitButtonText", _t('UserDefinedForm.TEXTONSUBMIT', 'Text on submit button:'), $submit),
+ new TextField("ClearButtonText", _t('UserDefinedForm.TEXTONCLEAR', 'Text on clear button:'), $clear),
+ new CheckboxField("ShowClearButton", _t('UserDefinedForm.SHOWCLEARFORM', 'Show Clear Form Button'), $this->ShowClearButton),
+ new CheckboxField("EnableLiveValidation", _t('UserDefinedForm.ENABLELIVEVALIDATION', 'Enable live validation')),
+ new CheckboxField("DisplayErrorMessagesAtTop", _t('UserDefinedForm.DISPLAYERRORMESSAGESATTOP', 'Display error messages above the form?')),
+ new CheckboxField('DisableCsrfSecurityToken', _t('UserDefinedForm.DISABLECSRFSECURITYTOKEN', 'Disable CSRF Token')),
+ new CheckboxField('DisableAuthenicatedFinishAction', _t('UserDefinedForm.DISABLEAUTHENICATEDFINISHACTION', 'Disable Authentication on finish action'))
+ );
+
+ $this->extend('updateFormOptions', $options);
+
+ return $options;
+ }
+
+ /**
+ * Get the HTML id of the error container displayed above the form.
+ *
+ * @return string
+ */
+ public function getErrorContainerID()
+ {
+ return $this->config()->error_container_id;
+ }
+
+ public function requireDefaultRecords()
+ {
+ parent::requireDefaultRecords();
+
+ if (!$this->config()->upgrade_on_build) {
+ return;
+ }
+
+ // Perform migrations
+ Injector::inst()
+ ->create('UserFormsUpgradeService')
+ ->setQuiet(true)
+ ->run();
+
+ DB::alteration_message('Migrated userforms', 'changed');
+ }
+
+
+ /**
+ * Validate formfields
+ */
+ public function getCMSValidator()
+ {
+ return new UserFormValidator();
+ }
+}
diff --git a/code/model/UserDefinedForm.php b/code/Model/UserDefinedFormController.php
old mode 100755
new mode 100644
similarity index 53%
rename from code/model/UserDefinedForm.php
rename to code/Model/UserDefinedFormController.php
index 2ffb788..8021ec7
--- a/code/model/UserDefinedForm.php
+++ b/code/Model/UserDefinedFormController.php
@@ -1,376 +1,12 @@
"Varchar",
- "ClearButtonText" => "Varchar",
- "OnCompleteMessage" => "HTMLText",
- "ShowClearButton" => "Boolean",
- 'DisableSaveSubmissions' => 'Boolean',
- 'EnableLiveValidation' => 'Boolean',
- 'DisplayErrorMessagesAtTop' => 'Boolean',
- 'DisableAuthenicatedFinishAction' => 'Boolean',
- 'DisableCsrfSecurityToken' => 'Boolean'
- );
-
- /**
- * @var array Default values of variables when this page is created
- */
- private static $defaults = array(
- 'Content' => '$UserDefinedForm',
- 'DisableSaveSubmissions' => 0,
- 'OnCompleteMessage' => 'Thanks, we\'ve received your submission.
'
- );
-
- /**
- * @var array
- */
- private static $has_many = array(
- "Submissions" => "SubmittedForm",
- "EmailRecipients" => "UserDefinedForm_EmailRecipient"
- );
-
- /**
- * @var array
- * @config
- */
- private static $casting = array(
- 'ErrorContainerID' => 'Text'
- );
-
- /**
- * Error container selector which matches the element for grouped messages
- *
- * @var string
- * @config
- */
- private static $error_container_id = 'error-container';
-
- /**
- * The configuration used to determine whether a confirmation message is to
- * appear when navigating away from a partially completed form.
- *
- * @var boolean
- * @config
- */
- private static $enable_are_you_sure = true;
-
- /**
- * @var bool
- * @config
- */
- private static $recipients_warning_enabled = false;
-
- /**
- * Temporary storage of field ids when the form is duplicated.
- * Example layout: array('EditableCheckbox3' => 'EditableCheckbox14')
- * @var array
- */
- protected $fieldsFromTo = array();
-
- /**
- * @return FieldList
- */
- public function getCMSFields()
- {
- Requirements::css(USERFORMS_DIR . '/css/UserForm_cms.css');
-
- $self = $this;
-
- $this->beforeUpdateCMSFields(function ($fields) use ($self) {
- // define tabs
- $fields->findOrMakeTab('Root.FormOptions', _t('UserDefinedForm.CONFIGURATION', 'Configuration'));
- $fields->findOrMakeTab('Root.Recipients', _t('UserDefinedForm.RECIPIENTS', 'Recipients'));
- $fields->findOrMakeTab('Root.Submissions', _t('UserDefinedForm.SUBMISSIONS', 'Submissions'));
-
- // text to show on complete
- $onCompleteFieldSet = new CompositeField(
- $label = new LabelField('OnCompleteMessageLabel', _t('UserDefinedForm.ONCOMPLETELABEL', 'Show on completion')),
- $editor = new HtmlEditorField('OnCompleteMessage', '', _t('UserDefinedForm.ONCOMPLETEMESSAGE', $self->OnCompleteMessage))
- );
-
- $onCompleteFieldSet->addExtraClass('field');
-
- $editor->setRows(3);
- $label->addExtraClass('left');
-
- // Define config for email recipients
- $emailRecipientsConfig = GridFieldConfig_RecordEditor::create(10);
- $emailRecipientsConfig->getComponentByType('GridFieldAddNewButton')
- ->setButtonName(
- _t('UserDefinedForm.ADDEMAILRECIPIENT', 'Add Email Recipient')
- );
-
- // who do we email on submission
- $emailRecipients = new GridField(
- 'EmailRecipients',
- _t('UserDefinedForm.EMAILRECIPIENTS', 'Email Recipients'),
- $self->EmailRecipients(),
- $emailRecipientsConfig
- );
- $emailRecipients
- ->getConfig()
- ->getComponentByType('GridFieldDetailForm')
- ->setItemRequestClass('UserFormRecipientItemRequest');
-
- $fields->addFieldsToTab('Root.FormOptions', $onCompleteFieldSet);
- $fields->addFieldToTab('Root.Recipients', $emailRecipients);
- $fields->addFieldsToTab('Root.FormOptions', $self->getFormOptions());
-
-
- // view the submissions
- // make sure a numeric not a empty string is checked against this int column for SQL server
- $parentID = (!empty($self->ID)) ? (int) $self->ID : 0;
-
- // get a list of all field names and values used for print and export CSV views of the GridField below.
- $columnSQL = <<map() as $name => $title) {
- $columns[$name] = trim(strtr($title, '.', ' '));
- }
-
- $config = new GridFieldConfig();
- $config->addComponent(new GridFieldToolbarHeader());
- $config->addComponent($sort = new GridFieldSortableHeader());
- $config->addComponent($filter = new UserFormsGridFieldFilterHeader());
- $config->addComponent(new GridFieldDataColumns());
- $config->addComponent(new GridFieldEditButton());
- $config->addComponent(new GridFieldDeleteAction());
- $config->addComponent(new GridFieldPageCount('toolbar-header-right'));
- $config->addComponent($pagination = new GridFieldPaginator(25));
- $config->addComponent(new GridFieldDetailForm());
- $config->addComponent(new GridFieldButtonRow('after'));
- $config->addComponent($export = new GridFieldExportButton('buttons-after-left'));
- $config->addComponent($print = new GridFieldPrintButton('buttons-after-left'));
-
- // show user form items in the summary tab
- $summaryarray = array(
- 'ID' => 'ID',
- 'Created' => 'Created',
- 'LastEdited' => 'Last Edited'
- );
- foreach(EditableFormField::get()->filter(array("ParentID" => $parentID)) as $eff) {
- if($eff->ShowInSummary) {
- $summaryarray[$eff->Name] = $eff->Title ?: $eff->Name;
- }
- }
-
- $config->getComponentByType('GridFieldDataColumns')->setDisplayFields($summaryarray);
-
- /**
- * Support for {@link https://github.com/colymba/GridFieldBulkEditingTools}
- */
- if (class_exists('GridFieldBulkManager')) {
- $config->addComponent(new GridFieldBulkManager());
- }
-
- $sort->setThrowExceptionOnBadDataType(false);
- $filter->setThrowExceptionOnBadDataType(false);
- $pagination->setThrowExceptionOnBadDataType(false);
-
- // attach every column to the print view form
- $columns['Created'] = 'Created';
- $columns['SubmittedBy.Email'] = 'Submitter';
- $filter->setColumns($columns);
-
- // print configuration
-
- $print->setPrintHasHeader(true);
- $print->setPrintColumns($columns);
-
- // export configuration
- $export->setCsvHasHeader(true);
- $export->setExportColumns($columns);
-
- $submissions = GridField::create(
- 'Submissions',
- _t('UserDefinedForm.SUBMISSIONS', 'Submissions'),
- $self->Submissions()->sort('Created', 'DESC'),
- $config
- );
- $fields->addFieldToTab('Root.Submissions', $submissions);
- $fields->addFieldToTab(
- 'Root.FormOptions',
- CheckboxField::create(
- 'DisableSaveSubmissions',
- _t('UserDefinedForm.SAVESUBMISSIONS', 'Disable Saving Submissions to Server')
- )
- );
- });
-
- $fields = parent::getCMSFields();
-
- if ($this->EmailRecipients()->Count() == 0 && static::config()->recipients_warning_enabled) {
- $fields->addFieldToTab("Root.Main", new LiteralField("EmailRecipientsWarning",
- "" . _t("UserDefinedForm.NORECIPIENTS",
- "Warning: You have not configured any recipients. Form submissions may be missed.")
- . "
"), "Title");
- }
-
- return $fields;
- }
-
- /**
- * Allow overriding the EmailRecipients on a {@link DataExtension}
- * so you can customise who receives an email.
- * Converts the RelationList to an ArrayList so that manipulation
- * of the original source data isn't possible.
- *
- * @return ArrayList
- */
- public function FilteredEmailRecipients($data = null, $form = null)
- {
- $recipients = new ArrayList($this->EmailRecipients()->toArray());
-
- // Filter by rules
- $recipients = $recipients->filterByCallback(function ($recipient) use ($data, $form) {
- /** @var UserDefinedForm_EmailRecipient $recipient */
- return $recipient->canSend($data, $form);
- });
-
- $this->extend('updateFilteredEmailRecipients', $recipients, $data, $form);
-
- return $recipients;
- }
-
- /**
- * Custom options for the form. You can extend the built in options by
- * using {@link updateFormOptions()}
- *
- * @return FieldList
- */
- public function getFormOptions()
- {
- $submit = ($this->SubmitButtonText) ? $this->SubmitButtonText : _t('UserDefinedForm.SUBMITBUTTON', 'Submit');
- $clear = ($this->ClearButtonText) ? $this->ClearButtonText : _t('UserDefinedForm.CLEARBUTTON', 'Clear');
-
- $options = new FieldList(
- new TextField("SubmitButtonText", _t('UserDefinedForm.TEXTONSUBMIT', 'Text on submit button:'), $submit),
- new TextField("ClearButtonText", _t('UserDefinedForm.TEXTONCLEAR', 'Text on clear button:'), $clear),
- new CheckboxField("ShowClearButton", _t('UserDefinedForm.SHOWCLEARFORM', 'Show Clear Form Button'), $this->ShowClearButton),
- new CheckboxField("EnableLiveValidation", _t('UserDefinedForm.ENABLELIVEVALIDATION', 'Enable live validation')),
- new CheckboxField("DisplayErrorMessagesAtTop", _t('UserDefinedForm.DISPLAYERRORMESSAGESATTOP', 'Display error messages above the form?')),
- new CheckboxField('DisableCsrfSecurityToken', _t('UserDefinedForm.DISABLECSRFSECURITYTOKEN', 'Disable CSRF Token')),
- new CheckboxField('DisableAuthenicatedFinishAction', _t('UserDefinedForm.DISABLEAUTHENICATEDFINISHACTION', 'Disable Authentication on finish action'))
- );
-
- $this->extend('updateFormOptions', $options);
-
- return $options;
- }
-
- /**
- * Get the HTML id of the error container displayed above the form.
- *
- * @return string
- */
- public function getErrorContainerID()
- {
- return $this->config()->error_container_id;
- }
-
- public function requireDefaultRecords()
- {
- parent::requireDefaultRecords();
-
- if (!$this->config()->upgrade_on_build) {
- return;
- }
-
- // Perform migrations
- Injector::inst()
- ->create('UserFormsUpgradeService')
- ->setQuiet(true)
- ->run();
-
- DB::alteration_message('Migrated userforms', 'changed');
- }
-
-
- /**
- * Validate formfields
- */
- public function getCMSValidator()
- {
- return new UserFormValidator();
- }
-}
-
/**
* Controller for the {@link UserDefinedForm} page type.
*
* @package userforms
*/
-class UserDefinedForm_Controller extends Page_Controller
+class UserDefinedFormController extends PageController
{
private static $finished_anchor = '#uff';
diff --git a/code/modifiers/DisambiguationSegmentFieldModifier.php b/code/Modifier/DisambiguationSegmentFieldModifier.php
similarity index 100%
rename from code/modifiers/DisambiguationSegmentFieldModifier.php
rename to code/Modifier/DisambiguationSegmentFieldModifier.php
diff --git a/code/modifiers/UnderscoreSegmentFieldModifier.php b/code/Modifier/UnderscoreSegmentFieldModifier.php
similarity index 100%
rename from code/modifiers/UnderscoreSegmentFieldModifier.php
rename to code/Modifier/UnderscoreSegmentFieldModifier.php
diff --git a/code/tasks/UserFormsColumnCleanTask.php b/code/Task/UserFormsColumnCleanTask.php
similarity index 100%
rename from code/tasks/UserFormsColumnCleanTask.php
rename to code/Task/UserFormsColumnCleanTask.php
diff --git a/code/tasks/UserFormsUpgradeService.php b/code/Task/UserFormsUpgradeService.php
similarity index 100%
rename from code/tasks/UserFormsUpgradeService.php
rename to code/Task/UserFormsUpgradeService.php
diff --git a/code/tasks/UserFormsUpgradeTask.php b/code/Task/UserFormsUpgradeTask.php
similarity index 100%
rename from code/tasks/UserFormsUpgradeTask.php
rename to code/Task/UserFormsUpgradeTask.php
diff --git a/code/tasks/UserFormsVersionedTask.php b/code/Task/UserFormsVersionedTask.php
similarity index 100%
rename from code/tasks/UserFormsVersionedTask.php
rename to code/Task/UserFormsVersionedTask.php
diff --git a/composer.json b/composer.json
index d80abad..fe634b2 100644
--- a/composer.json
+++ b/composer.json
@@ -30,10 +30,14 @@
}
],
"require": {
- "silverstripe/framework": "~3.2",
- "silverstripe/cms": "~3.2",
- "symbiote/silverstripe-gridfieldextensions": "~1.4",
- "silverstripe/segment-field": "^1.0"
+ "silverstripe/framework": "^4@dev",
+ "silverstripe/cms": "^4@dev",
+ "symbiote/silverstripe-gridfieldextensions": "^3@dev",
+ "silverstripe/segment-field": "^2@dev"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7",
+ "squizlabs/php_codesniffer": "*"
},
"suggest": {
"colymba/gridfield-bulk-editing-tools": "Allows for bulk management of form submissions",
@@ -44,5 +48,7 @@
"branch-alias": {
"dev-master": "5.0.x-dev"
}
- }
+ },
+ "prefer-stable": true,
+ "minimum-stability": "dev"
}
diff --git a/tests/UserFormTest.php b/tests/Form/UserFormTest.php
similarity index 100%
rename from tests/UserFormTest.php
rename to tests/Form/UserFormTest.php
diff --git a/tests/UserFormsCheckboxSetFieldTest.php b/tests/FormField/UserFormsCheckboxSetFieldTest.php
similarity index 100%
rename from tests/UserFormsCheckboxSetFieldTest.php
rename to tests/FormField/UserFormsCheckboxSetFieldTest.php
diff --git a/tests/EditableCustomRuleTest.php b/tests/Model/EditableCustomRuleTest.php
similarity index 100%
rename from tests/EditableCustomRuleTest.php
rename to tests/Model/EditableCustomRuleTest.php
diff --git a/tests/EditableCustomRuleTest.yml b/tests/Model/EditableCustomRuleTest.yml
similarity index 100%
rename from tests/EditableCustomRuleTest.yml
rename to tests/Model/EditableCustomRuleTest.yml
diff --git a/tests/EditableDropdownTest.php b/tests/Model/EditableFormField/EditableDropdownTest.php
similarity index 100%
rename from tests/EditableDropdownTest.php
rename to tests/Model/EditableFormField/EditableDropdownTest.php
diff --git a/tests/EditableFileFieldTest.php b/tests/Model/EditableFormField/EditableFileFieldTest.php
similarity index 100%
rename from tests/EditableFileFieldTest.php
rename to tests/Model/EditableFormField/EditableFileFieldTest.php
diff --git a/tests/EditableFormFieldTest.php b/tests/Model/EditableFormField/EditableFormFieldTest.php
similarity index 100%
rename from tests/EditableFormFieldTest.php
rename to tests/Model/EditableFormField/EditableFormFieldTest.php
diff --git a/tests/EditableFormFieldTest.yml b/tests/Model/EditableFormField/EditableFormFieldTest.yml
similarity index 100%
rename from tests/EditableFormFieldTest.yml
rename to tests/Model/EditableFormField/EditableFormFieldTest.yml
diff --git a/tests/EditableLiteralFieldTest.php b/tests/Model/EditableFormField/EditableLiteralFieldTest.php
similarity index 100%
rename from tests/EditableLiteralFieldTest.php
rename to tests/Model/EditableFormField/EditableLiteralFieldTest.php
diff --git a/tests/SecureEditableFileFieldTest.php b/tests/Model/EditableFormField/SecureEditableFileFieldTest.php
similarity index 100%
rename from tests/SecureEditableFileFieldTest.php
rename to tests/Model/EditableFormField/SecureEditableFileFieldTest.php
diff --git a/tests/UserDefinedForm_EmailRecipientConditionTest.php b/tests/Model/Recipient/UserDefinedForm_EmailRecipientConditionTest.php
similarity index 100%
rename from tests/UserDefinedForm_EmailRecipientConditionTest.php
rename to tests/Model/Recipient/UserDefinedForm_EmailRecipientConditionTest.php
diff --git a/tests/UserDefinedForm_EmailRecipientConditionTest.yml b/tests/Model/Recipient/UserDefinedForm_EmailRecipientConditionTest.yml
similarity index 100%
rename from tests/UserDefinedForm_EmailRecipientConditionTest.yml
rename to tests/Model/Recipient/UserDefinedForm_EmailRecipientConditionTest.yml
diff --git a/tests/UserDefinedFormControllerTest.php b/tests/Model/UserDefinedFormControllerTest.php
similarity index 100%
rename from tests/UserDefinedFormControllerTest.php
rename to tests/Model/UserDefinedFormControllerTest.php
diff --git a/tests/UserDefinedFormTest.php b/tests/Model/UserDefinedFormTest.php
similarity index 99%
rename from tests/UserDefinedFormTest.php
rename to tests/Model/UserDefinedFormTest.php
index fc44793..9be1ed1 100644
--- a/tests/UserDefinedFormTest.php
+++ b/tests/Model/UserDefinedFormTest.php
@@ -50,8 +50,8 @@ class UserDefinedFormTest extends FunctionalTest
$this->assertTrue($fields->dataFieldByName('OnCompleteMessage') != null);
}
-
- public function testGetCMSFieldsShowInSummary()
+
+ public function testGetCMSFieldsShowInSummary()
{
$this->logInWithPermission('ADMIN');
$form = $this->objFromFixture('UserDefinedForm', 'summary-rules-form');
@@ -69,7 +69,7 @@ class UserDefinedFormTest extends FunctionalTest
$this->assertNotContains('SummaryHide', array_keys($summaryFields), 'Summary field showing displayed field');
}
-
+
public function testEmailRecipientPopup()
{
$this->logInWithPermission('ADMIN');
diff --git a/tests/UserDefinedFormTest.yml b/tests/Model/UserDefinedFormTest.yml
similarity index 97%
rename from tests/UserDefinedFormTest.yml
rename to tests/Model/UserDefinedFormTest.yml
index 4b61b07..5dadd91 100644
--- a/tests/UserDefinedFormTest.yml
+++ b/tests/Model/UserDefinedFormTest.yml
@@ -20,7 +20,7 @@ EditableOption:
option-1:
Name: Option1
Title: Option 1
-
+
option-2:
Name: Option2
Title: Option 2
@@ -60,44 +60,44 @@ EditableOption:
option-9:
Name: Option9
Title: Green
-
+
EditableTextField:
basic-text:
Name: basic-text-name
Title: Basic Text Field
-
+
basic-text-2:
Name: basic-text-name
Title: Basic Text Field
-
+
your-name-field:
Name: your-name
Title: Name
-
+
address-field:
Name: address
Title: Address
-
+
street-field:
Name: street
Title: Street
-
+
city-field:
Name: city
Title: City
-
+
required-text:
Name: required-text-field
Title: Required Text Field
CustomErrorMessage: Custom Error Message
Required: true
-
+
field-1:
Name: Field1
field-2:
Name: Field2
-
+
some-field:
Name: SomeField
@@ -106,12 +106,12 @@ EditableTextField:
Title: Required Text Field
Required: true
CustomErrorMessage: 'This field is required'
-
+
summary-show:
Name: SummaryShow
Title: Summary Text Field
ShowInSummary: true
-
+
summary-hide:
Name: SummaryHide
Title: Summary Text Field
@@ -122,21 +122,21 @@ EditableDropdown:
Name: basic-dropdown
Title: Basic Dropdown Field
Options: =>EditableOption.option-1, =>EditableOption.option-2
-
+
department-dropdown:
Name: department
Title: Department
Options: =>EditableOption.department-1, =>EditableOption.department-2
-
+
EditableCheckbox:
checkbox-1:
Name: checkbox-1
Title: Checkbox 1
-
+
checkbox-2:
Name: checkbox-1
Title: Checkbox 1
-
+
EditableCheckboxGroupField:
checkbox-group:
Name: check-box-group
@@ -163,11 +163,11 @@ EditableRadioField:
Name: radio-option
Title: Radio Option
Options: =>EditableOption.option-5, =>EditableOption.option-6
-
+
EditableFieldGroupEnd:
group1end:
Name: group1end
-
+
EditableFieldGroup:
group1start:
Name: group1start
@@ -205,31 +205,31 @@ UserDefinedForm_EmailRecipient:
EmailAddress: test@example.com
EmailSubject: Email Subject
EmailFrom: no-reply@example.com
-
+
no-html:
EmailAddress: nohtml@example.com
EmailSubject: Email Subject
EmailFrom: no-reply@example.com
SendPlain: true
-
+
no-data:
EmailAddress: nodata@example.com
EmailSubject: Email Subject
- EmailFrom: no-reply@example.com
+ EmailFrom: no-reply@example.com
HideFormData: true
-
+
unfiltered-recipient-1:
EmailAddress: unfiltered@example.com
EmailSubject: Email Subject
EmailFrom: no-reply@example.com
-
+
filtered-recipient-1:
EmailAddress: filtered1@example.com
EmailSubject: Email Subject
EmailFrom: no-reply@example.com
CustomRules: =>UserDefinedForm_EmailRecipientCondition.blank-rule, =>UserDefinedForm_EmailRecipientCondition.not-blank-rule, =>UserDefinedForm_EmailRecipientCondition.equals-rule, =>UserDefinedForm_EmailRecipientCondition.not-equals-rule
CustomRulesCondition: 'And'
-
+
filtered-recipient-2:
EmailAddress: filtered2@example.com
EmailSubject: Email Subject
@@ -253,29 +253,29 @@ UserDefinedForm:
Title: User Defined Form
Fields: =>EditableFormStep.form1step1,=>EditableTextField.basic-text
EmailRecipients: =>UserDefinedForm_EmailRecipient.recipient-1, =>UserDefinedForm_EmailRecipient.no-html, =>UserDefinedForm_EmailRecipient.no-data
-
+
page-with-group:
Content: 'Page with group'
Title: 'page with group'
Fields: =>EditableFormStep.form7step1, =>EditableFieldGroup.group1start, =>EditableTextField.some-field, =>EditableFieldGroupEnd.group1end
-
+
form-with-reset-and-custom-action:
Title: Form with Reset Action
SubmitButtonText: Custom Button
ShowClearButton: true
-
+
validation-form:
Title: Validation Form
Fields: =>EditableFormStep.form3step1,=>EditableTextField.required-text
-
+
custom-rules-form:
Title: Custom Rules Form
Fields: =>EditableCheckbox.checkbox-2, =>EditableTextField.basic-text-2
-
+
summary-rules-form:
Title: Summary Fields Form
Fields: =>EditableTextField.summary-show, =>EditableTextField.summary-hide
-
+
empty-form:
Title: Empty Form
diff --git a/tests/UserFormsUpgradeServiceTest.php b/tests/Task/UserFormsUpgradeServiceTest.php
similarity index 100%
rename from tests/UserFormsUpgradeServiceTest.php
rename to tests/Task/UserFormsUpgradeServiceTest.php
diff --git a/tests/UserFormsUpgradeServiceTest.yml b/tests/Task/UserFormsUpgradeServiceTest.yml
similarity index 100%
rename from tests/UserFormsUpgradeServiceTest.yml
rename to tests/Task/UserFormsUpgradeServiceTest.yml
diff --git a/tests/UserFormsVersionedTest.php b/tests/Task/UserFormsVersionedTaskTest.php
similarity index 97%
rename from tests/UserFormsVersionedTest.php
rename to tests/Task/UserFormsVersionedTaskTest.php
index dfe0095..3c9f1a5 100644
--- a/tests/UserFormsVersionedTest.php
+++ b/tests/Task/UserFormsVersionedTaskTest.php
@@ -1,7 +1,7 @@