Skip to content

Commit

Permalink
FIX Try getting field with ID suffix for RequiredFields validation
Browse files Browse the repository at this point in the history
  • Loading branch information
emteknetnz committed Apr 29, 2024
1 parent 142a318 commit 76bae34
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 14 deletions.
17 changes: 15 additions & 2 deletions src/Forms/RequiredFields.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,16 +104,29 @@ public function php($data)
$fieldName = $fieldName->getName();
} else {
$formField = $fields->dataFieldByName($fieldName);
if (is_null($formField)) {
$formField = $fields->dataFieldByName($fieldName . 'ID');
}
}

// submitted data for file upload fields come back as an array
$value = isset($data[$fieldName]) ? $data[$fieldName] : null;
$value = null;
if (isset($data[$fieldName])) {
$value = $data[$fieldName];
} elseif (isset($data[$fieldName . 'ID'])) {
$value = $data[$fieldName . 'ID'];
}

if (is_array($value)) {
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 76bae34

Please sign in to comment.