From 447231dd5242a2303c65489aab97e67f2c70b1e0 Mon Sep 17 00:00:00 2001 From: core23 Date: Mon, 1 Apr 2024 18:20:43 +0200 Subject: [PATCH 1/4] Catch possible null value error in ModelFilter --- src/Filter/ModelFilter.php | 8 +++++++- tests/Filter/ModelFilterTest.php | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Filter/ModelFilter.php b/src/Filter/ModelFilter.php index 4bb45040d..010c52355 100644 --- a/src/Filter/ModelFilter.php +++ b/src/Filter/ModelFilter.php @@ -94,7 +94,9 @@ protected function handleMultiple(ProxyQueryInterface $query, string $alias, Fil ); } - $this->applyWhere($query, $inExpression); + if ($inExpression->count() > 0) { + $this->applyWhere($query, $inExpression); + } } protected function association(ProxyQueryInterface $query, FilterData $data): array @@ -147,6 +149,10 @@ private function buildInExpression(ProxyQueryInterface $query, string $alias, Fi $orX = $queryBuilder->expr()->orX(); foreach ($data->getValue() as $value) { + if (!\is_object($value)) { + continue; + } + $andX = $queryBuilder->expr()->andX(); foreach ($metadata->getIdentifierValues($value) as $fieldName => $identifierValue) { diff --git a/tests/Filter/ModelFilterTest.php b/tests/Filter/ModelFilterTest.php index 16fc7ed5c..63353a07c 100644 --- a/tests/Filter/ModelFilterTest.php +++ b/tests/Filter/ModelFilterTest.php @@ -53,6 +53,25 @@ public function testFilterArray(): void static::assertTrue($filter->isActive()); } + public function testFilterNonObject(): void + { + $filter = new ModelFilter(); + $filter->initialize('field_name', ['field_options' => ['class' => 'FooBar']]); + + $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); + + $objects = [new \stdClass(), new \stdClass()]; + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ + 'type' => EqualOperatorType::TYPE_EQUAL, + 'value' => null, + ])); + + // the alias is now computer by the entityJoin method + self::assertSameQuery([], $proxyQuery); + self::assertSameQueryParameters([], $proxyQuery); + static::assertFalse($filter->isActive()); + } + public function testFilterArrayTypeIsNotEqual(): void { $filter = new ModelFilter(); From 2d9091602c0cc6110e6c3c20d77f0fe267a950e0 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Wed, 10 Apr 2024 15:27:02 +0200 Subject: [PATCH 2/4] Clean --- tests/Filter/FilterTestCase.php | 4 ++-- tests/Filter/ModelFilterTest.php | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/Filter/FilterTestCase.php b/tests/Filter/FilterTestCase.php index 2137438d2..37a1a868b 100644 --- a/tests/Filter/FilterTestCase.php +++ b/tests/Filter/FilterTestCase.php @@ -26,7 +26,7 @@ abstract class FilterTestCase extends TestCase * @param string[] $expected * @param ProxyQuery $proxyQuery */ - final protected function assertSameQuery(array $expected, ProxyQuery $proxyQuery): void + final protected static function assertSameQuery(array $expected, ProxyQuery $proxyQuery): void { $queryBuilder = $proxyQuery->getQueryBuilder(); if (!$queryBuilder instanceof TestQueryBuilder) { @@ -40,7 +40,7 @@ final protected function assertSameQuery(array $expected, ProxyQuery $proxyQuery * @param mixed[] $expected * @param ProxyQuery $proxyQuery */ - final protected function assertSameQueryParameters(array $expected, ProxyQuery $proxyQuery): void + final protected static function assertSameQueryParameters(array $expected, ProxyQuery $proxyQuery): void { $queryBuilder = $proxyQuery->getQueryBuilder(); if (!$queryBuilder instanceof TestQueryBuilder) { diff --git a/tests/Filter/ModelFilterTest.php b/tests/Filter/ModelFilterTest.php index 63353a07c..643e26651 100644 --- a/tests/Filter/ModelFilterTest.php +++ b/tests/Filter/ModelFilterTest.php @@ -60,7 +60,6 @@ public function testFilterNonObject(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $objects = [new \stdClass(), new \stdClass()]; $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => EqualOperatorType::TYPE_EQUAL, 'value' => null, From 7b8f14a957694110279c77d3f11b9f44200425b7 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Wed, 10 Apr 2024 15:41:28 +0200 Subject: [PATCH 3/4] Fix UidFilter --- src/Filter/UidFilter.php | 1 + tests/Filter/UidFilterTest.php | 46 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 tests/Filter/UidFilterTest.php diff --git a/src/Filter/UidFilter.php b/src/Filter/UidFilter.php index 4a032e9c8..256463c31 100644 --- a/src/Filter/UidFilter.php +++ b/src/Filter/UidFilter.php @@ -59,6 +59,7 @@ public function getDefaultOptions(): array 'field_type' => TextType::class, 'operator_type' => EqualOperatorType::class, 'operator_options' => [], + 'global_search' => false, ]; } diff --git a/tests/Filter/UidFilterTest.php b/tests/Filter/UidFilterTest.php new file mode 100644 index 000000000..8c92563bb --- /dev/null +++ b/tests/Filter/UidFilterTest.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; + +use Sonata\AdminBundle\Filter\Model\FilterData; +use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; +use Sonata\DoctrineORMAdminBundle\Filter\UidFilter; + +final class UidFilterTest extends FilterTestCase +{ + public function testSearchEnabled(): void + { + $filter = new UidFilter(); + $filter->initialize('field_name'); + static::assertFalse($filter->isSearchEnabled()); + + $filter = new UidFilter(); + $filter->initialize('field_name', ['global_search' => true]); + static::assertTrue($filter->isSearchEnabled()); + } + + public function testEmpty(): void + { + $filter = new UidFilter(); + $filter->initialize('field_name'); + + $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); + + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => ''])); + + self::assertSameQuery([], $proxyQuery); + static::assertFalse($filter->isActive()); + } +} From 143fbb117957b620455f0bbc2784e2057953eadb Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Wed, 10 Apr 2024 16:56:20 +0200 Subject: [PATCH 4/4] 4.16.1 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e29ae6f95..04ccbac03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [4.16.1](https://github.com/sonata-project/SonataDoctrineORMAdminBundle/compare/4.16.0...4.16.1) - 2024-04-10 +### Fixed +- [[#1803](https://github.com/sonata-project/SonataDoctrineORMAdminBundle/pull/1803)] UidFilter `global_search` default value ([@VincentLanglet](https://github.com/VincentLanglet)) +- [[#1800](https://github.com/sonata-project/SonataDoctrineORMAdminBundle/pull/1800)] Catch possible null value error in `ModelFilter` ([@core23](https://github.com/core23)) + ## [4.16.0](https://github.com/sonata-project/SonataDoctrineORMAdminBundle/compare/4.15.0...4.16.0) - 2024-02-26 ### Added - [[#1796](https://github.com/sonata-project/SonataDoctrineORMAdminBundle/pull/1796)] Compatibility with `doctrine/dbal` 4 and `doctrine/orm` 3 ([@dmaicher](https://github.com/dmaicher))