From 798eb4c1bc925b2f94384988e4343e6367694f95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Thu, 18 Aug 2022 00:17:07 +0200 Subject: [PATCH] Automatically apply all filters of a compound filter using reflection. --- .../Filters/CompoundFilterTrait.php | 44 +++++++++++++++++++ src/DataTables/Filters/PartFilter.php | 9 ++-- 2 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 src/DataTables/Filters/CompoundFilterTrait.php diff --git a/src/DataTables/Filters/CompoundFilterTrait.php b/src/DataTables/Filters/CompoundFilterTrait.php new file mode 100644 index 00000000..70536512 --- /dev/null +++ b/src/DataTables/Filters/CompoundFilterTrait.php @@ -0,0 +1,44 @@ + $filter_object + * @return FilterInterface[] + */ + protected function findAllChildFilters(): array + { + $filters = []; + $reflection = new \ReflectionClass($this); + + foreach ($reflection->getProperties() as $property) { + $value = $property->getValue($this); + //We only want filters (objects implementing FilterInterface) + if($value instanceof FilterInterface) { + $filters[$property->getName()] = $value; + } + } + return $filters; + } + + /** + * Applies all children filters that are declared as property of this filter using reflection. + * @param QueryBuilder $queryBuilder + * @return void + */ + protected function applyAllChildFilters(QueryBuilder $queryBuilder): void + { + //Retrieve all child filters and apply them + $filters = $this->findAllChildFilters(); + + foreach ($filters as $filter) { + $filter->apply($queryBuilder); + } + } +} \ No newline at end of file diff --git a/src/DataTables/Filters/PartFilter.php b/src/DataTables/Filters/PartFilter.php index be8a7e7f..9ceb7b93 100644 --- a/src/DataTables/Filters/PartFilter.php +++ b/src/DataTables/Filters/PartFilter.php @@ -9,6 +9,9 @@ use Doctrine\ORM\QueryBuilder; class PartFilter implements FilterInterface { + + use CompoundFilterTrait; + /** @var TextConstraint */ protected $name; @@ -66,10 +69,6 @@ class PartFilter implements FilterInterface public function apply(QueryBuilder $queryBuilder): void { - $this->favorite->apply($queryBuilder); - $this->needsReview->apply($queryBuilder); - $this->mass->apply($queryBuilder); - $this->name->apply($queryBuilder); - $this->description->apply($queryBuilder); + $this->applyAllChildFilters($queryBuilder); } }