diff --git a/code/forms/UserForm.php b/code/forms/UserForm.php index d2f143344..e42f0e147 100644 --- a/code/forms/UserForm.php +++ b/code/forms/UserForm.php @@ -6,49 +6,49 @@ class UserForm extends Form { - /** - * @param Controller $controller - * @param string $name - */ + /** + * @param Controller $controller + * @param string $name + */ public function __construct(Controller $controller, $name = 'Form') { - $this->controller = $controller; - $this->setRedirectToFormOnValidationError(true); - - parent::__construct( - $controller, - $name, - new FieldList(), - new FieldList() - ); - - $this->setFields($fields = $this->getFormFields()); - $fields->setForm($this); - $this->setActions($actions = $this->getFormActions()); - $actions->setForm($this); - $this->setValidator($this->getRequiredFields()); + $this->controller = $controller; + $this->setRedirectToFormOnValidationError(true); + + parent::__construct( + $controller, + $name, + new FieldList(), + new FieldList() + ); + + $this->setFields($fields = $this->getFormFields()); + $fields->setForm($this); + $this->setActions($actions = $this->getFormActions()); + $actions->setForm($this); + $this->setValidator($this->getRequiredFields()); // This needs to be re-evaluated since fields have been assigned $this->setupFormErrors(); - // Number each page - $stepNumber = 1; - foreach ($this->getSteps() as $step) { - $step->setStepNumber($stepNumber++); - } + // Number each page + $stepNumber = 1; + foreach($this->getSteps() as $step) { + $step->setStepNumber($stepNumber++); + } - if ($controller->DisableCsrfSecurityToken) { - $this->disableSecurityToken(); - } + if($controller->DisableCsrfSecurityToken) { + $this->disableSecurityToken(); + } - $data = Session::get("FormInfo.{$this->FormName()}.data"); + $data = Session::get("FormInfo.{$this->FormName()}.data"); - if (is_array($data)) { - $this->loadDataFrom($data); - } + if(is_array($data)) { + $this->loadDataFrom($data); + } - $this->extend('updateForm'); - } + $this->extend('updateForm'); + } public function setupFormErrors() { @@ -60,118 +60,126 @@ public function setupFormErrors() return $this; } - /** - * Used for partial caching in the template. - * - * @return string - */ + /** + * Used for partial caching in the template. + * + * @return string + */ public function getLastEdited() { - return $this->controller->LastEdited; - } + return $this->controller->LastEdited; + } - /** - * @return bool - */ + /** + * @return bool + */ public function getDisplayErrorMessagesAtTop() { - return (bool)$this->controller->DisplayErrorMessagesAtTop; - } - - /** - * Return the fieldlist, filtered to only contain steps - * - * @return ArrayList - */ + return (bool)$this->controller->DisplayErrorMessagesAtTop; + } + + /** + * Return the fieldlist, filtered to only contain steps + * + * @return ArrayList + */ public function getSteps() { - return $this->Fields()->filterByCallback(function ($field) { - return $field instanceof UserFormsStepField; - }); - } - - /** - * Get the form fields for the form on this page. Can modify this FieldSet - * by using {@link updateFormFields()} on an {@link Extension} subclass which - * is applied to this controller. - * - * This will be a list of top level composite steps - * - * @return FieldList - */ + return $this->Fields()->filterByCallback(function($field) { + return $field instanceof UserFormsStepField; + }); + } + + /** + * Get the form fields for the form on this page. Can modify this FieldSet + * by using {@link updateFormFields()} on an {@link Extension} subclass which + * is applied to this controller. + * + * This will be a list of top level composite steps + * + * @return FieldList + */ public function getFormFields() { - $fields = new UserFormsFieldList(); - $target = $fields; - foreach ($this->controller->Fields() as $field) { - $target = $target->processNext($field); - } - $fields->clearEmptySteps(); - $this->extend('updateFormFields', $fields); + $fields = new UserFormsFieldList(); + $target = $fields; + foreach ($this->controller->Fields() as $field) { + $target = $target->processNext($field); + } + $fields->clearEmptySteps(); + $this->extend('updateFormFields', $fields); $fields->setForm($this); - return $fields; - } - - /** - * Generate the form actions for the UserDefinedForm. You - * can manipulate these by using {@link updateFormActions()} on - * a decorator. - * - * @todo Make form actions editable via their own field editor. - * - * @return FieldList - */ + return $fields; + } + + /** + * Generate the form actions for the UserDefinedForm. You + * can manipulate these by using {@link updateFormActions()} on + * a decorator. + * + * @todo Make form actions editable via their own field editor. + * + * @return FieldList + */ public function getFormActions() { - $submitText = ($this->controller->SubmitButtonText) ? $this->controller->SubmitButtonText : _t('UserDefinedForm.SUBMITBUTTON', 'Submit'); - $clearText = ($this->controller->ClearButtonText) ? $this->controller->ClearButtonText : _t('UserDefinedForm.CLEARBUTTON', 'Clear'); + $submitText = ($this->controller->SubmitButtonText) ? $this->controller->SubmitButtonText : _t('UserDefinedForm.SUBMITBUTTON', 'Submit'); + $clearText = ($this->controller->ClearButtonText) ? $this->controller->ClearButtonText : _t('UserDefinedForm.CLEARBUTTON', 'Clear'); - $actions = new FieldList( - new FormAction("process", $submitText) - ); + $actions = new FieldList( + new FormAction("process", $submitText) + ); - if ($this->controller->ShowClearButton) { - $actions->push(new ResetFormAction("clearForm", $clearText)); - } + if($this->controller->ShowClearButton) { + $actions->push(new ResetFormAction("clearForm", $clearText)); + } - $this->extend('updateFormActions', $actions); + $this->extend('updateFormActions', $actions); $actions->setForm($this); - return $actions; - } - - /** - * Get the required form fields for this form. - * - * @return RequiredFields - */ + return $actions; + } + + /** + * Get the required form fields for this form. + * + * @return RequiredFields + */ public function getRequiredFields() { - // Generate required field validator - $requiredNames = $this + // Generate required field validator + $requiredNames = $this ->getController() - ->Fields() - ->filter('Required', true) - ->column('Name'); - $required = new RequiredFields($requiredNames); - $this->extend('updateRequiredFields', $required); + ->Fields() + ->filter('Required', true) + ->column('Name'); + $required = new RequiredFields($requiredNames); + $this->extend('updateRequiredFields', $required); $required->setForm($this); - return $required; - } - - /** - * Override some we can add UserForm specific attributes to the form. - * - * @return array - */ + return $required; + } + + /** + * Override some we can add UserForm specific attributes to the form. + * + * @return array + */ public function getAttributes() { - $attrs = parent::getAttributes(); + $attrs = parent::getAttributes(); - $attrs['class'] = $attrs['class'] . ' userform'; - $attrs['data-livevalidation'] = (bool)$this->controller->EnableLiveValidation; - $attrs['data-toperrors'] = (bool)$this->controller->DisplayErrorMessagesAtTop; - $attrs['data-hidefieldlabels'] = (bool)$this->controller->HideFieldLabels; + $attrs['class'] = $attrs['class'] . ' userform'; + $attrs['data-livevalidation'] = (bool)$this->controller->EnableLiveValidation; + $attrs['data-toperrors'] = (bool)$this->controller->DisplayErrorMessagesAtTop; + $attrs['data-hidefieldlabels'] = (bool)$this->controller->HideFieldLabels; - return $attrs; + return $attrs; + } + + /** + * @return string + */ + public function getButtonText() { + return $this->config()->get('button_text'); } + } diff --git a/code/model/editableformfields/EditableOption.php b/code/model/editableformfields/EditableOption.php index 9fb493c30..5ed3569a8 100644 --- a/code/model/editableformfields/EditableOption.php +++ b/code/model/editableformfields/EditableOption.php @@ -10,32 +10,32 @@ class EditableOption extends DataObject { - private static $default_sort = "Sort"; + private static $default_sort = "Sort"; - private static $db = array( - "Name" => "Varchar(255)", - "Title" => "Varchar(255)", - "Default" => "Boolean", + private static $db = array( + "Name" => "Varchar(255)", + "Title" => "Varchar(255)", + "Default" => "Boolean", "Sort" => "Int", "Value" => "Varchar(255)", - ); + ); - private static $has_one = array( - "Parent" => "EditableMultipleOptionField", - ); + private static $has_one = array( + "Parent" => "EditableMultipleOptionField", + ); - private static $extensions = array( - "Versioned('Stage', 'Live')" - ); + private static $extensions = array( + "Versioned('Stage', 'Live')" + ); - private static $summary_fields = array( - 'Title', - 'Default' - ); + private static $summary_fields = array( + 'Title', + 'Default' + ); protected static $allow_empty_values = false; - /** + /** * Returns whether to allow empty values or not. * * @return boolean @@ -56,29 +56,29 @@ public static function set_allow_empty_values($allow) } /** - * @param Member $member - * - * @return boolean - */ + * @param Member $member + * + * @return boolean + */ public function canEdit($member = null) { - return $this->Parent()->canEdit($member); - } - - /** - * @param Member $member - * - * @return boolean - */ + return $this->Parent()->canEdit($member); + } + + /** + * @param Member $member + * + * @return boolean + */ public function canDelete($member = null) { - return $this->canEdit($member); - } + return $this->canEdit($member); + } public function getEscapedTitle() { - return Convert::raw2att($this->Title); - } + return Convert::raw2att($this->Title); + } /** * @param Member $member @@ -86,27 +86,27 @@ public function getEscapedTitle() */ public function canView($member = null) { - return $this->Parent()->canView($member); - } + return $this->Parent()->canView($member); + } - /** - * Return whether a user can create an object of this type - * + /** + * Return whether a user can create an object of this type + * * @param Member $member * @param array $context Virtual parameter to allow context to be passed in to check - * @return bool - */ + * @return bool + */ public function canCreate($member = null) { - // Check parent page + // Check parent page $parent = $this->getCanCreateContext(func_get_args()); - if ($parent) { + if($parent) { return $parent->canEdit($member); } // Fall back to secure admin permissions return parent::canCreate($member); - } + } /** * Helper method to check the parent for this object @@ -117,11 +117,11 @@ public function canCreate($member = null) protected function getCanCreateContext($args) { // Inspect second parameter to canCreate for a 'Parent' context - if (isset($args[1]['Parent'])) { + if(isset($args[1]['Parent'])) { return $args[1]['Parent']; } // Hack in currently edited page if context is missing - if (Controller::has_curr() && Controller::curr() instanceof CMSMain) { + if(Controller::has_curr() && Controller::curr() instanceof CMSMain) { return Controller::curr()->currentPage(); } @@ -161,4 +161,12 @@ public function getValue() } return $value; } + + protected function onBeforeWrite() { + if (!$this->Sort) { + $this->Sort = EditableOption::get()->max('Sort') + 1; + } + + parent::onBeforeWrite(); + } } diff --git a/docs/en/installation.md b/docs/en/installation.md index d3a560081..23c3593b6 100644 --- a/docs/en/installation.md +++ b/docs/en/installation.md @@ -83,4 +83,13 @@ UserDefinedForm: email_template_directory: your/template/path/ ```` -Any SilverStripe templates placed in your `email_template_directory` directory will be available for use with submission emails. \ No newline at end of file +Any SilverStripe templates placed in your `email_template_directory` directory will be available for use with submission emails. + +### Custom Multi-Step button Text + +If you want to change the button text when using the Multi-Step/Page Break feature, simply add the following to your `config.yml`: + +```` +UserForm: + button_text: 'Your Text Here' +```` \ No newline at end of file diff --git a/javascript/UserForm.js b/javascript/UserForm.js index 8e38140bf..bbf10a6da 100644 --- a/javascript/UserForm.js +++ b/javascript/UserForm.js @@ -468,7 +468,7 @@ jQuery(function ($) { this.$buttons.each(function (i, stepButton) { $(stepButton).on('click', function (e) { e.preventDefault(); - self.$el.trigger('userform.progress.changestep', [parseInt($(this).text(), 10)]); + self.$el.trigger('userform.progress.changestep', [parseInt($(this).data('step'), 10)]); }); }); @@ -552,7 +552,7 @@ jQuery(function ($) { var $element = $(element), $item = $element.parent(); - if (parseInt($element.text(), 10) === stepNumber && $element.is(':visible')) { + if (parseInt($element.data('step'), 10) === stepNumber && $element.is(':visible')) { $item.addClass('current viewed'); $element.removeAttr('disabled'); diff --git a/templates/Includes/UserFormProgress.ss b/templates/Includes/UserFormProgress.ss index 0097ce37a..0eebf13ba 100644 --- a/templates/Includes/UserFormProgress.ss +++ b/templates/Includes/UserFormProgress.ss @@ -9,7 +9,7 @@ <% loop $Steps %>