Skip to content

Commit a62e554

Browse files
Merge pull request #10733 from creative-commoners/pulls/4.13/searchable
FIX Respect searchable_fields
2 parents 0d041e7 + 0f40cc3 commit a62e554

File tree

3 files changed

+45
-10
lines changed

3 files changed

+45
-10
lines changed

src/Forms/GridField/GridFieldFilterHeader.php

+14-10
Original file line numberDiff line numberDiff line change
@@ -254,21 +254,25 @@ public function getManipulatedData(GridField $gridField, SS_List $dataList)
254254
public function canFilterAnyColumns($gridField)
255255
{
256256
$list = $gridField->getList();
257-
258-
if (!$this->checkDataType($list)) {
257+
if (!($list instanceof Filterable) || !$this->checkDataType($list)) {
259258
return false;
260259
}
261-
262-
$columns = $gridField->getColumns();
263-
foreach ($columns as $columnField) {
264-
$metadata = $gridField->getColumnMetadata($columnField);
265-
$title = $metadata['title'];
266-
267-
if ($title && $list->canFilterBy($columnField)) {
260+
$modelClass = $gridField->getModelClass();
261+
// note: searchableFields() will return summary_fields if there are no searchable_fields on the model
262+
$searchableFields = array_keys($modelClass::singleton()->searchableFields());
263+
$summaryFields = array_keys($modelClass::singleton()->summaryFields());
264+
sort($searchableFields);
265+
sort($summaryFields);
266+
// searchable_fields has been explictily defined i.e. searchableFields() is not falling back to summary_fields
267+
if ($searchableFields !== $summaryFields) {
268+
return true;
269+
}
270+
// we have fallen back to summary_fields, check they are filterable
271+
foreach ($searchableFields as $searchableField) {
272+
if ($list->canFilterBy($searchableField)) {
268273
return true;
269274
}
270275
}
271-
272276
return false;
273277
}
274278

tests/php/Forms/GridField/GridFieldFilterHeaderTest.php

+26
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,30 @@ public function testCustomSearchField()
182182

183183
$this->assertEquals('ReallyCustomSearch', $this->component->getSearchField());
184184
}
185+
186+
public function testCanFilterAnyColumns()
187+
{
188+
$gridField = $this->gridField;
189+
$filterHeader = $gridField->getConfig()->getComponentByType(GridFieldFilterHeader::class);
190+
191+
// test that you can filter by something if searchable_fields is not defined
192+
// silverstripe will scaffold db columns that are in the gridfield to be
193+
// searchable by default
194+
Config::modify()->remove(Team::class, 'searchable_fields');
195+
$this->assertTrue($filterHeader->canFilterAnyColumns($gridField));
196+
197+
// test that you can filterBy if searchable_fields is defined
198+
Config::modify()->set(Team::class, 'searchable_fields', ['Name']);
199+
$this->assertTrue($filterHeader->canFilterAnyColumns($gridField));
200+
201+
// test that you can filterBy if searchable_fields even if it is not a legit field
202+
// this is because we're making a blind assumption it will be filterable later in a SearchContext
203+
Config::modify()->set(Team::class, 'searchable_fields', ['WhatIsThis']);
204+
$this->assertTrue($filterHeader->canFilterAnyColumns($gridField));
205+
206+
// test that you cannot filter by non-db field when it falls back to summary_fields
207+
Config::modify()->remove(Team::class, 'searchable_fields');
208+
Config::modify()->set(Team::class, 'summary_fields', ['MySummaryField']);
209+
$this->assertFalse($filterHeader->canFilterAnyColumns($gridField));
210+
}
185211
}

tests/php/Forms/GridField/GridFieldFilterHeaderTest/Team.php

+5
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,9 @@ class Team extends DataObject implements TestOnly
2424
'Cheerleader' => Cheerleader::class,
2525
'CheerleadersMom' => Mom::class
2626
];
27+
28+
public function getMySummaryField()
29+
{
30+
return 'MY SUMMARY FIELD';
31+
}
2732
}

0 commit comments

Comments
 (0)