diff --git a/forms/GroupedDropdownField.php b/forms/GroupedDropdownField.php index 500ecfa9e..f128d94ac 100644 --- a/forms/GroupedDropdownField.php +++ b/forms/GroupedDropdownField.php @@ -89,11 +89,42 @@ class GroupedDropdownField extends DropdownField { } /** - * @todo Implement DropdownField::validate() with group validation support + * Validate this field + * + * @param Validator $validator + * @return bool */ public function validate($validator) { + $valid = false; + $source = $this->getSourceAsArray(); + + if ($this->value) { + foreach ($source as $value => $title) { + // Check if value matches an option, or is in a nested array of grouped options + if ((is_array($title) && array_key_exists($this->value, $title)) + || ($this->value == $value) + ) { + $valid = true; + } + } + } elseif ($this->getHasEmptyDefault()) { + $valid = true; + } + + if (!$valid) { + $validator->validationError( + $this->name, + _t( + 'DropdownField.SOURCE_VALIDATION', + "Please select a value within the list provided. {value} is not a valid option", + array('value' => $this->value) + ), + "validation" + ); + return false; + } + return true; } } - diff --git a/tests/forms/GroupedDropdownFieldTest.php b/tests/forms/GroupedDropdownFieldTest.php new file mode 100644 index 000000000..772684f91 --- /dev/null +++ b/tests/forms/GroupedDropdownFieldTest.php @@ -0,0 +1,44 @@ + "One", + "Group One" => array( + "2" => "Two", + "3" => "Three" + ), + "Group Two" => array( + "4" => "Four" + ) + )); + + $validator = new RequiredFields(); + + $field->setValue("1"); + $this->assertTrue($field->validate($validator)); + + //test grouped values + $field->setValue("3"); + $this->assertTrue($field->validate($validator)); + + //non-existent value should make the field invalid + $field->setValue("Over 9000"); + $this->assertFalse($field->validate($validator)); + + //empty string shouldn't validate + $field->setValue(''); + $this->assertFalse($field->validate($validator)); + + //empty field should validate after being set + $field->setEmptyString('Empty String'); + $field->setValue(''); + $this->assertTrue($field->validate($validator)); + } + +}