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 @@