From c7cd26299a3945de0d3635bdfa845bb771cd95a6 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Tue, 15 Aug 2023 11:31:20 +1200 Subject: [PATCH] Fix ArrayList canFilterBy to work with ArrayData (#10915) --- src/ORM/ArrayList.php | 10 +++++++++- tests/php/ORM/ArrayListTest.php | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/ORM/ArrayList.php b/src/ORM/ArrayList.php index c5c478326..d0b8ae6db 100644 --- a/src/ORM/ArrayList.php +++ b/src/ORM/ArrayList.php @@ -604,7 +604,15 @@ class ArrayList extends ViewableData implements SS_List, Filterable, Sortable, L $firstRecord = $this->first(); - return is_array($firstRecord) ? array_key_exists($by, $firstRecord) : property_exists($firstRecord, $by ?? ''); + if (is_array($firstRecord)) { + return array_key_exists($by, $firstRecord); + } + + if ($firstRecord instanceof ViewableData) { + return $firstRecord->hasField($by); + } + + return property_exists($firstRecord, $by ?? ''); } /** diff --git a/tests/php/ORM/ArrayListTest.php b/tests/php/ORM/ArrayListTest.php index 9cb606030..a2253f280 100644 --- a/tests/php/ORM/ArrayListTest.php +++ b/tests/php/ORM/ArrayListTest.php @@ -7,6 +7,7 @@ use SilverStripe\Dev\SapphireTest; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\Filterable; +use SilverStripe\View\ArrayData; use stdClass; class ArrayListTest extends SapphireTest @@ -1174,6 +1175,20 @@ class ArrayListTest extends SapphireTest $this->assertFalse($list->canFilterBy('Age')); } + public function testCanFilterByArrayData() + { + $list = new ArrayList( + [ + new ArrayData(['Name' => 'Steve']), + new ArrayData(['Name' => 'Bob']), + new ArrayData(['Name' => 'John']) + ] + ); + + $this->assertTrue($list->canFilterBy('Name')); + $this->assertFalse($list->canFilterBy('Age')); + } + public function testCanFilterByEmpty() { $list = new ArrayList();