diff --git a/src/TagField.php b/src/TagField.php index 8235961..316a947 100644 --- a/src/TagField.php +++ b/src/TagField.php @@ -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,7 +318,15 @@ class TagField extends MultiSelectField return parent::setValue($value); } - return parent::setValue(array_filter($value)); + // Safely map php / react-select values to flat list + $values = []; + foreach ($value as $item) { + if ($item) { + $values[] = isset($item['Value']) ? $item['Value'] : $item; + } + } + + return parent::setValue($values); } /** diff --git a/tests/TagFieldTest.php b/tests/TagFieldTest.php index 29e7441..e33a362 100755 --- a/tests/TagFieldTest.php +++ b/tests/TagFieldTest.php @@ -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