Skip to content

Commit

Permalink
Merge pull request #11068 from creative-commoners/pulls/4.13/treedrop…
Browse files Browse the repository at this point in the history
…down-required

FIX Add extraEmptyValues to TreedropdownField
  • Loading branch information
sabina-talipova authored Nov 28, 2023
2 parents 7eab49f + 4dbbf04 commit 1d69236
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 4 deletions.
11 changes: 9 additions & 2 deletions src/Forms/RequiredFields.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,15 @@ public function php($data)
$error = (count($value ?? [])) ? false : true;
}
} else {
// assume a string or integer
$error = (strlen($value ?? '')) ? false : true;
$stringValue = (string) $value;
if ($formField instanceof TreeDropdownField) {
// test for blank string as well as '0' because older versions of silverstripe/admin FormBuilder
// forms created using redux-form would have a value of null for unsaved records
// the null value will have been converted to '' by the time it gets to this point
$error = in_array($stringValue, ['0', '']);
} else {
$error = strlen($stringValue) > 0 ? false : true;
}
}

if ($formField && $error) {
Expand Down
19 changes: 18 additions & 1 deletion src/Forms/TreeDropdownField.php
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,12 @@ public function __construct(

$this->addExtraClass('single');

parent::__construct($name, $title);
// Set a default value of 0 instead of null
// Because TreedropdownField requires SourceObject to have the Hierarchy extension, make the default
// value the same as the default value for a RelationID, which is 0.
$value = 0;

parent::__construct($name, $title, $value);
}

/**
Expand Down Expand Up @@ -981,4 +986,16 @@ public function setShowSelectedPath($showSelectedPath)
$this->showSelectedPath = $showSelectedPath;
return $this;
}

/**
* @return array
*/
public function getSchemaValidation()
{
$validationList = parent::getSchemaValidation();
if (array_key_exists('required', $validationList)) {
$validationList['required'] = ['extraEmptyValues' => ['0']];
}
return $validationList;
}
}
18 changes: 17 additions & 1 deletion tests/php/Forms/RequiredFieldsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@

use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\TreeDropdownField;
use SilverStripe\Security\Group;

/**
* @todo Test the validation method php()
* @skipUpgrade
*/
class RequiredFieldsTest extends SapphireTest
{

public function testConstructingWithArray()
{
//can we construct with an array?
Expand Down Expand Up @@ -290,4 +292,18 @@ public function testFieldIsRequired()
"Unexpectedly returned true for a non-existent field"
);
}

public function testTreedropFieldValidation()
{
$form = new Form();
$field = new TreeDropdownField('TestField', 'TestField', Group::class);
$form->Fields()->push($field);
$validator = new RequiredFields('TestField');
$validator->setForm($form);
// blank string and '0' are fail required field validation
$this->assertFalse($validator->php(['TestField' => '']));
$this->assertFalse($validator->php(['TestField' => '0']));
// '1' passes required field validation
$this->assertTrue($validator->php(['TestField' => '1']));
}
}
17 changes: 17 additions & 0 deletions tests/php/Forms/TreeDropdownFieldTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\TreeDropdownField;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\Tests\HierarchyTest\HierarchyOnSubclassTestObject;
Expand Down Expand Up @@ -52,6 +53,22 @@ public function testSchemaStateDefaults()
);
}

public function testGetSchemaValidation(): void
{
// field is not required
$field = new TreeDropdownField('TestTree', 'Test tree', Folder::class);
$expected = [];
$this->assertSame($expected, $field->getSchemaValidation());
// field is required
$fieldList = new FieldList([$field]);
$validator = new RequiredFields('TestTree');
new Form(null, null, $fieldList, null, $validator);
$expected = [
'required' => ['extraEmptyValues' => ['0']],
];
$this->assertSame($expected, $field->getSchemaValidation());
}

public function testTreeSearchJson()
{
$field = new TreeDropdownField('TestTree', 'Test tree', Folder::class);
Expand Down

0 comments on commit 1d69236

Please sign in to comment.