mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
404f450ac3
GroupedDropdownField was showing empty values in Readonly mode due to not correctly handling the hierarchical source array. Uses flattened source now in GroupedDropdownField->performReadonlyTransformation()
168 lines
4.8 KiB
PHP
168 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace SilverStripe\Forms\Tests;
|
|
|
|
use SilverStripe\Dev\SapphireTest;
|
|
use SilverStripe\Forms\GroupedDropdownField;
|
|
use SilverStripe\Forms\RequiredFields;
|
|
|
|
class GroupedDropdownFieldTest extends SapphireTest
|
|
{
|
|
|
|
public function testValidation()
|
|
{
|
|
$field = GroupedDropdownField::create(
|
|
'Test',
|
|
'Testing',
|
|
[
|
|
"1" => "One",
|
|
"Group One" => [
|
|
"2" => "Two",
|
|
"3" => "Three"
|
|
],
|
|
"Group Two" => [
|
|
"4" => "Four"
|
|
],
|
|
]
|
|
);
|
|
|
|
$this->assertEquals(["1", "2", "3", "4"], $field->getValidValues());
|
|
|
|
$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));
|
|
|
|
//disabled items shouldn't validate
|
|
$field->setDisabledItems(['1']);
|
|
$field->setValue('1');
|
|
|
|
$this->assertEquals(["2", "3", "4"], $field->getValidValues());
|
|
$this->assertEquals(["1"], $field->getDisabledItems());
|
|
|
|
$this->assertFalse($field->validate($validator));
|
|
}
|
|
|
|
/**
|
|
* Test that empty-string values are supported by GroupDropdownTest
|
|
*/
|
|
public function testEmptyString()
|
|
{
|
|
// Case A: empty value in the top level of the source
|
|
$field = GroupedDropdownField::create(
|
|
'Test',
|
|
'Testing',
|
|
[
|
|
"" => "(Choose A)",
|
|
"1" => "One",
|
|
"Group One" => [
|
|
"2" => "Two",
|
|
"3" => "Three"
|
|
],
|
|
"Group Two" => [
|
|
"4" => "Four"
|
|
],
|
|
]
|
|
);
|
|
|
|
$this->assertRegExp(
|
|
'/<option value="" selected="selected" >\(Choose A\)<\/option>/',
|
|
preg_replace('/\s+/', ' ', (string)$field->Field())
|
|
);
|
|
|
|
// Case B: empty value in the nested level of the source
|
|
$field = GroupedDropdownField::create(
|
|
'Test',
|
|
'Testing',
|
|
[
|
|
"1" => "One",
|
|
"Group One" => [
|
|
"" => "(Choose B)",
|
|
"2" => "Two",
|
|
"3" => "Three"
|
|
],
|
|
"Group Two" => [
|
|
"4" => "Four"
|
|
],
|
|
]
|
|
);
|
|
$this->assertRegExp(
|
|
'/<option value="" selected="selected" >\(Choose B\)<\/option>/',
|
|
preg_replace('/\s+/', ' ', (string)$field->Field())
|
|
);
|
|
|
|
// Case C: setEmptyString
|
|
$field = GroupedDropdownField::create(
|
|
'Test',
|
|
'Testing',
|
|
[
|
|
"1" => "One",
|
|
"Group One" => [
|
|
"2" => "Two",
|
|
"3" => "Three"
|
|
],
|
|
"Group Two" => [
|
|
"4" => "Four"
|
|
],
|
|
]
|
|
);
|
|
$field->setEmptyString('(Choose C)');
|
|
$this->assertRegExp(
|
|
'/<option value="" selected="selected" >\(Choose C\)<\/option>/',
|
|
preg_replace('/\s+/', ' ', (string)$field->Field())
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Test that readonly version of GroupedDropdownField displays all values
|
|
*/
|
|
public function testReadonlyValue()
|
|
{
|
|
$field = GroupedDropdownField::create(
|
|
'Test',
|
|
'Testing',
|
|
[
|
|
"1" => "One",
|
|
"Group One" => [
|
|
"2" => "Two",
|
|
"3" => "Three"
|
|
],
|
|
"Group Two" => [
|
|
"4" => "Four"
|
|
],
|
|
]
|
|
);
|
|
|
|
// value on first level
|
|
$field->setValue("1");
|
|
$this->assertRegExp(
|
|
'/<span class="readonly" id="Test">One<\/span><input type="hidden" name="Test" value="1" \/>/',
|
|
(string)$field->performReadonlyTransformation()->Field()
|
|
);
|
|
|
|
// value on first level
|
|
$field->setValue("2");
|
|
$this->assertRegExp(
|
|
'/<span class="readonly" id="Test">Two<\/span><input type="hidden" name="Test" value="2" \/>/',
|
|
(string)$field->performReadonlyTransformation()->Field()
|
|
);
|
|
}
|
|
}
|