From 9ce6d91b76e525a6fc81e02023e9e53cdf82e047 Mon Sep 17 00:00:00 2001 From: Serge Latyntcev Date: Thu, 22 Nov 2018 12:11:18 +1300 Subject: [PATCH] FIX / TreeMultiselectField::objectForKey handles list of IDs correctly --- src/Forms/TreeMultiselectField.php | 6 +++++- tests/php/Forms/TreeMultiselectFieldTest.php | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Forms/TreeMultiselectField.php b/src/Forms/TreeMultiselectField.php index 422b5739a..372890f6b 100644 --- a/src/Forms/TreeMultiselectField.php +++ b/src/Forms/TreeMultiselectField.php @@ -279,10 +279,14 @@ class TreeMultiselectField extends TreeDropdownField * of numeric types with string values, issuing a database error. * * This fix is not ideal, but supposed to keep backward compatibility for SS4. - * Since SS5 this method should be removed and NULL should be used instead of 'unchanged'. + * + * In 5.0 this method to be removed and NULL should be used instead of 'unchanged' (or an empty array. to be decided). + * In 5.0 this class to be refactored so that $this->value is always an array of values (or null) */ if ($this->getKeyField() === 'ID' && $key === 'unchanged') { $key = null; + } elseif (is_string($key)) { + $key = preg_split('/\s*,\s*/', trim($key)); } return parent::objectForKey($key); diff --git a/tests/php/Forms/TreeMultiselectFieldTest.php b/tests/php/Forms/TreeMultiselectFieldTest.php index ffff5491f..2686b71a2 100644 --- a/tests/php/Forms/TreeMultiselectFieldTest.php +++ b/tests/php/Forms/TreeMultiselectFieldTest.php @@ -20,6 +20,9 @@ class TreeMultiselectFieldTest extends SapphireTest $schemaStateDefaults = $field->getSchemaStateDefaults(); $this->assertArraySubset(['id' => 'TestTree', 'name' => 'TestTree', 'value' => 'unchanged'], $schemaStateDefaults, $strict = true); + $items = $field->getItems(); + $this->assertCount(0, $items, $message = 'there must be no items selected'); + $html = $field->performReadonlyTransformation()->Field(); $this->assertEquals( @@ -45,6 +48,9 @@ HTML $schemaStateDefaults = $field->getSchemaStateDefaults(); $this->assertArraySubset(['id' => 'TestTree', 'name' => 'TestTree', 'value' => [$asdf->ID, $subfolderfile1->ID]], $schemaStateDefaults, $strict = true); + $items = $field->getItems(); + $this->assertCount(2, $items, $message = 'there must be exactly 2 items selected'); + $html = (string)$field->performReadonlyTransformation()->Field(); $this->assertEquals(