diff --git a/code/model/editableformfields/EditableMultipleOptionField.php b/code/model/editableformfields/EditableMultipleOptionField.php index 7b3ef28..08ee2a4 100644 --- a/code/model/editableformfields/EditableMultipleOptionField.php +++ b/code/model/editableformfields/EditableMultipleOptionField.php @@ -40,7 +40,13 @@ class EditableMultipleOptionField extends EditableFormField { 'callback' => function($record, $column, $grid) { return TextField::create($column); } - ), + ), + 'Value' => array( + 'title' => _t('EditableMultipleOptionField.VALUE', 'Value'), + 'callback' => function($record, $column, $grid) { + return TextField::create($column); + } + ), 'Default' => array( 'title' => _t('EditableMultipleOptionField.DEFAULT', 'Selected by default?'), 'callback' => function($record, $column, $grid) { @@ -171,7 +177,7 @@ class EditableMultipleOptionField extends EditableFormField { */ protected function getOptionsMap() { $optionSet = $this->Options(); - $optionMap = $optionSet->map('EscapedTitle', 'Title'); + $optionMap = $optionSet->map('Value', 'Title'); if($optionMap instanceof SS_Map) { return $optionMap->toArray(); } diff --git a/code/model/editableformfields/EditableOption.php b/code/model/editableformfields/EditableOption.php index 16812f5..01c1793 100644 --- a/code/model/editableformfields/EditableOption.php +++ b/code/model/editableformfields/EditableOption.php @@ -15,7 +15,8 @@ class EditableOption extends DataObject { "Name" => "Varchar(255)", "Title" => "Varchar(255)", "Default" => "Boolean", - "Sort" => "Int" + "Sort" => "Int", + "Value" => "Varchar(255)", ); private static $has_one = array( @@ -31,6 +32,26 @@ class EditableOption extends DataObject { 'Default' ); + protected static $allow_empty_values = false; + + /** + * Returns whether to allow empty values or not. + * + * @return boolean + */ + public static function allow_empty_values() { + return (bool) self::$allow_empty_values; + } + + /** + * Set whether to allow empty values. + * + * @param boolean $allow + */ + public static function set_allow_empty_values($allow) { + self::$allow_empty_values = (bool) $allow; + } + /** * @param Member $member * @@ -114,4 +135,19 @@ class EditableOption extends DataObject { public function canUnpublish($member = null) { return $this->canDelete($member); } + + /** + * Fetches a value for $this->Value. If empty values are not allowed, + * then this will return the title in the case of an empty value. + * + * @return string + */ + public function getValue() + { + $value = $this->getField('Value'); + if(empty($value) && !self::allow_empty_values()) { + return $this->Title; + } + return $value; + } } diff --git a/tests/EditableFormFieldTest.php b/tests/EditableFormFieldTest.php index eb83d7e..95998cb 100644 --- a/tests/EditableFormFieldTest.php +++ b/tests/EditableFormFieldTest.php @@ -70,6 +70,26 @@ class EditableFormFieldTest extends FunctionalTest { $this->assertEquals(0, $checkbox->EffectiveDisplayRules()->count()); } + /** + * @covers EditableOption::getValue + */ + public function testEditableOptionEmptyValue() { + $option = $this->objFromFixture('EditableOption', 'option-1'); + $option->Value = ''; + + // Disallow empty values + EditableOption::set_allow_empty_values(false); + $this->assertEquals($option->Title, $option->Value); + + $option->Value = 'test'; + $this->assertEquals('test', $option->Value); + + // Allow empty values + EditableOption::set_allow_empty_values(true); + $option->Value = ''; + $this->assertEquals('', $option->Value); + } + function testEditableDropdownField() { $dropdown = $this->objFromFixture('EditableDropdown', 'basic-dropdown'); diff --git a/tests/EditableFormFieldTest.yml b/tests/EditableFormFieldTest.yml index 1f6df12..e4f308f 100644 --- a/tests/EditableFormFieldTest.yml +++ b/tests/EditableFormFieldTest.yml @@ -8,34 +8,42 @@ EditableOption: option-1: Name: Option1 Title: Option 1 + Value: Option 1 option-2: Name: Option2 Title: Option 2 + Value: Option 2 department-1: Name: dept1 Title: sales@example.com + Value: sales@example.com department-2: Name: dept2 Title: accounts@example.com + Value: accounts@example.com option-3: Name: Option3 Title: Option 3 + Value: Option 3 option-4: Name: Option4 Title: Option 4 + Value: Option 4 option-5: Name: Option5 Title: Option 5 + Value: Option 5 option-6: Name: Option6 Title: Option 6 + Value: Option 6 UserDefinedForm_EmailRecipient: recipient-1: @@ -52,7 +60,7 @@ UserDefinedForm_EmailRecipient: no-data: EmailAddress: nodata@example.com EmailSubject: Email Subject - EmailFrom: no-reply@example.com + EmailFrom: no-reply@example.com HideFormData: true EditableTextField: