FIX: DropdownField didn't consider disabled items

This commit is contained in:
Loz Calver 2015-05-22 21:11:01 +01:00
parent dfb9b76b95
commit 68d8df4e04
4 changed files with 27 additions and 6 deletions

View File

@ -314,7 +314,9 @@ class DropdownField extends FormField {
*/ */
public function validate($validator) { public function validate($validator) {
$source = $this->getSourceAsArray(); $source = $this->getSourceAsArray();
if (!array_key_exists($this->value, $source)) { $disabled = $this->getDisabledItems();
if (!array_key_exists($this->value, $source) || in_array($this->value, $disabled)) {
if ($this->getHasEmptyDefault() && !$this->value) { if ($this->getHasEmptyDefault() && !$this->value) {
return true; return true;
} }

View File

@ -97,13 +97,17 @@ class GroupedDropdownField extends DropdownField {
public function validate($validator) { public function validate($validator) {
$valid = false; $valid = false;
$source = $this->getSourceAsArray(); $source = $this->getSourceAsArray();
$disabled = $this->getDisabledItems();
if ($this->value) { if ($this->value) {
foreach ($source as $value => $title) { 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)) {
if ((is_array($title) && array_key_exists($this->value, $title)) // Check that the set value is not in the list of disabled items
|| ($this->value == $value) if (!isset($disabled[$value]) || !in_array($this->value, $disabled[$value])) {
) { $valid = true;
}
// Check that the value matches and is not disabled
} elseif($this->value == $value && !in_array($this->value, $disabled)) {
$valid = true; $valid = true;
} }
} }

View File

@ -313,7 +313,8 @@ class DropdownFieldTest extends SapphireTest {
public function testValidation() { public function testValidation() {
$field = DropdownField::create('Test', 'Testing', array( $field = DropdownField::create('Test', 'Testing', array(
"One" => "One", "One" => "One",
"Two" => "Two" "Two" => "Two",
"Five" => "Five"
)); ));
$validator = new RequiredFields(); $validator = new RequiredFields();
$form = new Form($this, 'Form', new FieldList($field), new FieldList(), $validator); $form = new Form($this, 'Form', new FieldList($field), new FieldList(), $validator);
@ -331,6 +332,10 @@ class DropdownFieldTest extends SapphireTest {
$field->setEmptyString('Empty String'); $field->setEmptyString('Empty String');
$field->setValue(''); $field->setValue('');
$this->assertTrue($field->validate($validator)); $this->assertTrue($field->validate($validator));
//disabled items shouldn't validate
$field->setDisabledItems(array('Five'));
$field->setValue('Five');
$this->assertFalse($field->validate($validator));
} }
} }

View File

@ -39,6 +39,16 @@ class GroupedDropdownFieldTest extends SapphireTest {
$field->setEmptyString('Empty String'); $field->setEmptyString('Empty String');
$field->setValue(''); $field->setValue('');
$this->assertTrue($field->validate($validator)); $this->assertTrue($field->validate($validator));
//disabled items shouldn't validate
$field->setDisabledItems(array('1'));
$field->setValue('1');
$this->assertFalse($field->validate($validator));
//grouped disabled items shouldn't validate
$field->setDisabledItems(array("Group One" => array("2")));
$field->setValue('2');
$this->assertFalse($field->validate($validator));
} }
} }