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..c5d9176e 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,21 @@ 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): void { + $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:');