Skip to content

Commit

Permalink
FIX Handle getting HasOneRelationFieldInterface passed as an array
Browse files Browse the repository at this point in the history
  • Loading branch information
emteknetnz committed May 2, 2024
1 parent 142a318 commit 9ade813
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 13 deletions.
7 changes: 6 additions & 1 deletion src/Forms/RequiredFields.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,12 @@ public function php($data)
if ($formField instanceof FileField && isset($value['error']) && $value['error']) {
$error = true;
} else {
$error = (count($value ?? [])) ? false : true;
if (is_a($formField, HasOneRelationFieldInterface::class) && isset($value['value'])) {
$stringValue = (string) $value['value'];
$error = in_array($stringValue, ['0', '']);
} else {
$error = (count($value ?? [])) ? false : true;
}
}
} else {
$stringValue = (string) $value;
Expand Down
3 changes: 2 additions & 1 deletion src/Forms/SearchableDropdownField.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
use SilverStripe\Dev\Deprecation;
use SilverStripe\Forms\DropdownField;
use SilverStripe\ORM\DataList;
use SilverStripe\Forms\HasOneRelationFieldInterface;

class SearchableDropdownField extends DropdownField
class SearchableDropdownField extends DropdownField implements HasOneRelationFieldInterface
{
use SearchableDropdownTrait;

Expand Down
33 changes: 22 additions & 11 deletions tests/php/Forms/RequiredFieldsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\SearchableDropdownField;
use SilverStripe\Forms\TreeDropdownField;
use SilverStripe\Security\Group;

Expand Down Expand Up @@ -289,17 +290,27 @@ public function testFieldIsRequired()
);
}

public function testTreedropFieldValidation()
public function testHasOneRelationFieldInterfaceValidation()
{
$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']));
$fieldClasses = [TreeDropdownField::class, SearchableDropdownField::class];
$suffixes = ['', 'ID'];
foreach ($fieldClasses as $fieldClass) {
foreach ($suffixes as $suffix) {
$form = new Form();
$param = $fieldClass === TreeDropdownField::class ? Group::class : Group::get();
$field = new $fieldClass('TestField' . $suffix, 'TestField', $param);
$form->Fields()->push($field);
$validator = new RequiredFields('TestField');
$validator->setForm($form);
// blank string and 0 and '0' and array with value of 0 fail required field validation
$this->assertFalse($validator->php(['TestField' => '']));
$this->assertFalse($validator->php(['TestField' => 0]));
$this->assertFalse($validator->php(['TestField' => '0']));
$this->assertFalse($validator->php(['TestField' => ['value' => 0]]));
$this->assertFalse($validator->php(['TestField' => ['value' => '0']]));
// '1' passes required field validation
$this->assertTrue($validator->php(['TestField' => '1']));
}
}
}
}

0 comments on commit 9ade813

Please sign in to comment.