BUG Resolve issue with react select values not being saved

Fixes #150
This commit is contained in:
Damian Mooyman 2020-07-06 14:17:08 +12:00
parent 3b6ec92e66
commit a61612ec4b
No known key found for this signature in database
GPG Key ID: 19B1752E86A700BB
2 changed files with 32 additions and 1 deletions

View File

@ -6,7 +6,6 @@ use Exception;
use SilverStripe\Control\Controller;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\MultiSelectField;
use SilverStripe\Forms\Validator;
@ -319,6 +318,14 @@ class TagField extends MultiSelectField
return parent::setValue($value);
}
// Safely map php / react-select values to flat list
$values = [];
foreach ($value as $item) {
if ($item) {
$values[] = $item['Value'] ?? $item;
}
}
return parent::setValue(array_filter($value));
}

View File

@ -131,6 +131,30 @@ class TagFieldTest extends SapphireTest
$record
);
}
public function testSavesReactTags()
{
$record = $this->getNewTagFieldTestBlogPost('BlogPost1');
$record->write();
$field = new TagField('Tags', '', new DataList(TagFieldTestBlogTag::class));
$field->setValue([
[
'Title' => 'Tag1',
'Value' => 'Tag1',
],
[
'Title' => 'Tag2',
'Value' => 'Tag2',
],
]);
$field->saveInto($record);
$this->compareExpectedAndActualTags(
['Tag1', 'Tag2'],
$record
);
}
/**
* Ensure that {@see TagField::saveInto} respects existing tags