Add validation for GroupedDropdownField (closes #3923)

This commit is contained in:
Loz Calver 2015-05-22 20:55:54 +01:00
parent 1b94aa2c04
commit dfb9b76b95
2 changed files with 77 additions and 2 deletions

View File

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

View File

@ -0,0 +1,44 @@
<?php
/**
* @package framework
* @subpackage tests
*/
class GroupedDropdownFieldTest extends SapphireTest {
public function testValidation() {
$field = GroupedDropdownField::create('Test', 'Testing', array(
"1" => "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));
}
}