From ed8914d1c51d927f92003e641d243bf05211d907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20=C4=8Cern=C3=ADk?= Date: Tue, 5 May 2026 21:30:20 +0200 Subject: [PATCH 1/2] Custom where condition for NetteDatabaseDataSource --- .docs/filters.md | 10 ++++++++++ src/DataSource/NetteDatabaseDataSource.php | 6 +++--- .../NetteDatabaseDataSourceTest.phpt | 19 ++++++++++++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/.docs/filters.md b/.docs/filters.md index e1e741d0..afbd24fd 100644 --- a/.docs/filters.md +++ b/.docs/filters.md @@ -90,6 +90,16 @@ $grid->addFilterText('custom', 'Custom search:', 'name') }); ``` + +When using `NetteDatabaseDataSource`, the callback receives the data source instance. Use `addWhereCondition()` to append raw SQL conditions: + +```php +$grid->addFilterText('custom', 'Custom search:', 'name') + ->setCondition(function(NetteDatabaseDataSource $dataSource, $value) { + $dataSource->addWhereCondition('id > ?', [strlen($value)]); + }); +``` + ### Templates: Filters can also have their own templates: diff --git a/src/DataSource/NetteDatabaseDataSource.php b/src/DataSource/NetteDatabaseDataSource.php index ae63dc65..3c6a4ee4 100644 --- a/src/DataSource/NetteDatabaseDataSource.php +++ b/src/DataSource/NetteDatabaseDataSource.php @@ -110,9 +110,9 @@ public function sort(Sorting $sorting): IDataSource return $this; } - public function getDataSource(): Explorer + public function getDataSource(): NetteDatabaseDataSource { - return $this->connection; + return $this; } /** @@ -128,7 +128,7 @@ public function getQuery(): array /** * @param mixed[] $params */ - protected function addWhereCondition(string $sql, array $params = []): void + public function addWhereCondition(string $sql, array $params = []): void { $this->whereConditions[] = [$sql, $params]; } diff --git a/tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt b/tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt index f4d46b51..4e176fe9 100644 --- a/tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt +++ b/tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt @@ -167,7 +167,7 @@ final class NetteDatabaseDataSourceTest extends BaseDataSourceTest public function testGetDataSource(): void { $s = new NetteDatabaseDataSource($this->db, 'SELECT * FROM users'); - Assert::same($this->db, $s->getDataSource()); + Assert::same($s, $s->getDataSource()); } public function testGetDataCached(): void @@ -308,6 +308,23 @@ final class NetteDatabaseDataSourceTest extends BaseDataSourceTest Assert::same(['%John%', '%John%'], $params); } + + public function testCustomWhereCondition(): void + { + $s = new NetteDatabaseDataSource($this->db, 'SELECT * FROM users'); + $filter = new FilterText($this->grid, 'a', 'b', []); + $filter->setValue('text'); + $filter->setCondition(function(NetteDatabaseDataSource $dataSource, $value){ + $dataSource->addWhereCondition('id > ?', [strlen($value)]); + }); + $s->filter([$filter]); + [$sql, $params] = $s->getQuery(); + + Assert::same('SELECT * FROM (SELECT * FROM users) AS datagrid_base WHERE id > ?', $sql); + Assert::same([4], $params); + } + + protected function setUpDatabase(): void { $connection = new Connection('sqlite::memory:'); From 984dd289149f9877e61ab2b051966bd364c31d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20=C4=8Cern=C3=ADk?= Date: Tue, 5 May 2026 22:26:06 +0200 Subject: [PATCH 2/2] Coding standards NetteDatabaseDataSourceTest Co-authored-by: Copilot --- tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt b/tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt index 4e176fe9..c5d9176e 100644 --- a/tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt +++ b/tests/Cases/DataSources/NetteDatabaseDataSourceTest.phpt @@ -308,13 +308,12 @@ final class NetteDatabaseDataSourceTest extends BaseDataSourceTest Assert::same(['%John%', '%John%'], $params); } - public function testCustomWhereCondition(): void { $s = new NetteDatabaseDataSource($this->db, 'SELECT * FROM users'); $filter = new FilterText($this->grid, 'a', 'b', []); $filter->setValue('text'); - $filter->setCondition(function(NetteDatabaseDataSource $dataSource, $value){ + $filter->setCondition(function (NetteDatabaseDataSource $dataSource, $value): void { $dataSource->addWhereCondition('id > ?', [strlen($value)]); }); $s->filter([$filter]); @@ -324,7 +323,6 @@ final class NetteDatabaseDataSourceTest extends BaseDataSourceTest Assert::same([4], $params); } - protected function setUpDatabase(): void { $connection = new Connection('sqlite::memory:');