Skip to content

Commit 043d16e

Browse files
authored
Fix: invalid date in DateFilter/DateRangeFilter throws exception in A… (#1262)
* Fix: invalid date in DateFilter/DateRangeFilter throws exception in ArrayDataSource and ElasticsearchDataSource Closes #641 * Tests: add ArrayDataSource tests for invalid date filter values
1 parent 550981a commit 043d16e

3 files changed

Lines changed: 93 additions & 20 deletions

File tree

src/DataSource/ArrayDataSource.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,12 @@ protected function applyFilterDateRange(mixed $row, FilterDateRange $filter): bo
236236
$row_value = $row[$filter->getColumn()];
237237

238238
if ($values['from'] !== null && $values['from'] !== '') {
239-
$date_from = DateTimeHelper::tryConvertToDate($values['from'], [$format]);
240-
$date_from->setTime(0, 0, 0);
239+
try {
240+
$date_from = DateTimeHelper::tryConvertToDate($values['from'], [$format]);
241+
$date_from->setTime(0, 0, 0);
242+
} catch (DatagridDateTimeHelperException) {
243+
return false;
244+
}
241245

242246
if (!($row_value instanceof DateTime)) {
243247
/**
@@ -259,8 +263,12 @@ protected function applyFilterDateRange(mixed $row, FilterDateRange $filter): bo
259263
}
260264

261265
if ($values['to'] !== null && $values['to'] !== '') {
262-
$date_to = DateTimeHelper::tryConvertToDate($values['to'], [$format]);
263-
$date_to->setTime(23, 59, 59);
266+
try {
267+
$date_to = DateTimeHelper::tryConvertToDate($values['to'], [$format]);
268+
$date_to->setTime(23, 59, 59);
269+
} catch (DatagridDateTimeHelperException) {
270+
return false;
271+
}
264272

265273
if (!($row_value instanceof DateTime)) {
266274
/**
@@ -295,7 +303,11 @@ protected function applyFilterDate(mixed $row, FilterDate $filter): bool
295303
foreach ($condition as $column => $value) {
296304
$row_value = $row[$column];
297305

298-
$date = DateTimeHelper::tryConvertToDateTime($value, [$format]);
306+
try {
307+
$date = DateTimeHelper::tryConvertToDateTime($value, [$format]);
308+
} catch (DatagridDateTimeHelperException) {
309+
return false;
310+
}
299311

300312
if (!($row_value instanceof DateTime)) {
301313
/**

src/DataSource/ElasticsearchDataSource.php

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Contributte\Datagrid\DataSource;
44

5+
use Contributte\Datagrid\Exception\DatagridDateTimeHelperException;
56
use Contributte\Datagrid\Filter\FilterDate;
67
use Contributte\Datagrid\Filter\FilterDateRange;
78
use Contributte\Datagrid\Filter\FilterMultiSelect;
@@ -90,17 +91,21 @@ public function applyFilterDate(FilterDate $filter): void
9091
$timestampTo = null;
9192

9293
if ($value) {
93-
$dateFrom = DateTimeHelper::tryConvertToDateTime($value, [$filter->getPhpFormat()]);
94-
$dateFrom->setTime(0, 0, 0);
94+
try {
95+
$dateFrom = DateTimeHelper::tryConvertToDateTime($value, [$filter->getPhpFormat()]);
96+
$dateFrom->setTime(0, 0, 0);
9597

96-
$timestampFrom = $dateFrom->getTimestamp();
98+
$timestampFrom = $dateFrom->getTimestamp();
9799

98-
$dateTo = DateTimeHelper::tryConvertToDateTime($value, [$filter->getPhpFormat()]);
99-
$dateTo->setTime(23, 59, 59);
100+
$dateTo = DateTimeHelper::tryConvertToDateTime($value, [$filter->getPhpFormat()]);
101+
$dateTo->setTime(23, 59, 59);
100102

101-
$timestampTo = $dateTo->getTimestamp();
103+
$timestampTo = $dateTo->getTimestamp();
102104

103-
$this->searchParamsBuilder->addRangeQuery($column, $timestampFrom, $timestampTo);
105+
$this->searchParamsBuilder->addRangeQuery($column, $timestampFrom, $timestampTo);
106+
} catch (DatagridDateTimeHelperException) {
107+
// ignore the invalid filter value
108+
}
104109
}
105110
}
106111
}
@@ -112,17 +117,25 @@ public function applyFilterDateRange(FilterDateRange $filter): void
112117
$timestampTo = null;
113118

114119
if ($values['from']) {
115-
$dateFrom = DateTimeHelper::tryConvertToDateTime($values['from'], [$filter->getPhpFormat()]);
116-
$dateFrom->setTime(0, 0, 0);
117-
118-
$timestampFrom = $dateFrom->getTimestamp();
120+
try {
121+
$dateFrom = DateTimeHelper::tryConvertToDateTime($values['from'], [$filter->getPhpFormat()]);
122+
$dateFrom->setTime(0, 0, 0);
123+
124+
$timestampFrom = $dateFrom->getTimestamp();
125+
} catch (DatagridDateTimeHelperException) {
126+
// ignore the invalid filter value
127+
}
119128
}
120129

121130
if ($values['to']) {
122-
$dateTo = DateTimeHelper::tryConvertToDateTime($values['to'], [$filter->getPhpFormat()]);
123-
$dateTo->setTime(23, 59, 59);
124-
125-
$timestampTo = $dateTo->getTimestamp();
131+
try {
132+
$dateTo = DateTimeHelper::tryConvertToDateTime($values['to'], [$filter->getPhpFormat()]);
133+
$dateTo->setTime(23, 59, 59);
134+
135+
$timestampTo = $dateTo->getTimestamp();
136+
} catch (DatagridDateTimeHelperException) {
137+
// ignore the invalid filter value
138+
}
126139
}
127140

128141
if (is_int($timestampFrom) || is_int($timestampTo)) {

tests/Cases/DataSources/ArrayDataSourceTest.phpt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
namespace Contributte\Datagrid\Tests\Cases\DataSources;
44

55
use Contributte\Datagrid\DataSource\ArrayDataSource;
6+
use Contributte\Datagrid\Filter\FilterDate;
7+
use Contributte\Datagrid\Filter\FilterDateRange;
68
use Contributte\Datagrid\Tests\Files\TestingDatagridFactory;
9+
use Tester\Assert;
710

811
require __DIR__ . '/BaseDataSourceTest.phpt';
912

@@ -18,6 +21,51 @@ final class ArrayDataSourceTest extends BaseDataSourceTest
1821
$this->grid = $factory->createTestingDatagrid();
1922
}
2023

24+
public function testFilterDateWithInvalidValue(): void
25+
{
26+
$ds = new ArrayDataSource([
27+
['id' => 1, 'date' => '1. 1. 2020'],
28+
['id' => 2, 'date' => '15. 6. 2021'],
29+
]);
30+
31+
$filter = new FilterDate($this->grid, 'date', 'Date', 'date');
32+
$filter->setValue('not-a-date');
33+
34+
$ds->filter([$filter]);
35+
36+
Assert::same(0, $ds->getCount());
37+
}
38+
39+
public function testFilterDateRangeWithInvalidFromValue(): void
40+
{
41+
$ds = new ArrayDataSource([
42+
['id' => 1, 'date' => '1. 1. 2020'],
43+
['id' => 2, 'date' => '15. 6. 2021'],
44+
]);
45+
46+
$filter = new FilterDateRange($this->grid, 'date', 'Date', 'date', 'Date to');
47+
$filter->setValue(['from' => 'not-a-date', 'to' => '']);
48+
49+
$ds->filter([$filter]);
50+
51+
Assert::same(0, $ds->getCount());
52+
}
53+
54+
public function testFilterDateRangeWithInvalidToValue(): void
55+
{
56+
$ds = new ArrayDataSource([
57+
['id' => 1, 'date' => '1. 1. 2020'],
58+
['id' => 2, 'date' => '15. 6. 2021'],
59+
]);
60+
61+
$filter = new FilterDateRange($this->grid, 'date', 'Date', 'date', 'Date to');
62+
$filter->setValue(['from' => '', 'to' => 'not-a-date']);
63+
64+
$ds->filter([$filter]);
65+
66+
Assert::same(0, $ds->getCount());
67+
}
68+
2169
}
2270

2371
(new ArrayDataSourceTest())->run();

0 commit comments

Comments
 (0)