From 529b0ea365bb844d7b3c20fe82a61cdead0fef61 Mon Sep 17 00:00:00 2001 From: Jean-Pascal Devierne Date: Thu, 6 Dec 2018 16:19:24 +0100 Subject: [PATCH 1/4] Added operator handling in PostQueryBuilderSubscriber --- .../PostQueryBuilderSubscriber.php | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/EventListener/PostQueryBuilderSubscriber.php b/src/EventListener/PostQueryBuilderSubscriber.php index 9307328..7a6968a 100644 --- a/src/EventListener/PostQueryBuilderSubscriber.php +++ b/src/EventListener/PostQueryBuilderSubscriber.php @@ -14,6 +14,13 @@ */ class PostQueryBuilderSubscriber implements EventSubscriberInterface { + protected static $operators = [ + '_GT' => '>', + '_GTE' => '>=', + '_LT' => '<', + '_LTE' => '<=', + ]; + /** * @var \AlterPHP\EasyAdminExtensionBundle\Helper\ListFormFiltersHelper */ @@ -170,6 +177,15 @@ protected function filterQueryBuilder(QueryBuilder $queryBuilder, string $field, $parameter = null; $filterDqlPart = $field.' IS NOT NULL'; break; + // Special case if value has an operatorPrefix + case $operatorPrefix = $this->getOperatorPrefix($value): + // get value without prefix + $value = substr($value, \strlen($operatorPrefix)); + + $operator = static::$operators[$operatorPrefix]; + + $filterDqlPart = $field.' '. $operator .' :'.$parameter; + break; // Default is equality default: $filterDqlPart = $field.' = :'.$parameter; @@ -207,4 +223,16 @@ protected function isFilterAppliable(QueryBuilder $queryBuilder, string $field): return true; } + + protected function getOperatorPrefix($value): string + { + $operatorPrefixes = array_keys(static::$operators); + + foreach ($operatorPrefixes as $operatorPrefix) { + if (strpos($value, $operatorPrefix) === 0) { + return $operatorPrefix; + } + } + return ''; + } } From d00f5f536977e25a00adaa3594f19bdb2eb9a566 Mon Sep 17 00:00:00 2001 From: Jean-Pascal Devierne Date: Thu, 6 Dec 2018 16:36:39 +0100 Subject: [PATCH 2/4] Added GreaterThanFilterTextType as a POC --- .../PostQueryBuilderSubscriber.php | 3 ++- .../Operator/GreaterThanModelTransformer.php | 13 +++++++++ .../Traits/OperatorModelTransformerTrait.php | 27 +++++++++++++++++++ .../Operator/GreaterThanFilterTextType.php | 22 +++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/Form/Transformer/Operator/GreaterThanModelTransformer.php create mode 100644 src/Form/Transformer/Operator/Traits/OperatorModelTransformerTrait.php create mode 100644 src/Form/Type/Operator/GreaterThanFilterTextType.php diff --git a/src/EventListener/PostQueryBuilderSubscriber.php b/src/EventListener/PostQueryBuilderSubscriber.php index 7a6968a..e8a8b31 100644 --- a/src/EventListener/PostQueryBuilderSubscriber.php +++ b/src/EventListener/PostQueryBuilderSubscriber.php @@ -2,6 +2,7 @@ namespace AlterPHP\EasyAdminExtensionBundle\EventListener; +use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\GreaterThanModelTransformer; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Query\QueryException; @@ -15,7 +16,7 @@ class PostQueryBuilderSubscriber implements EventSubscriberInterface { protected static $operators = [ - '_GT' => '>', + GreaterThanModelTransformer::OPERATOR_PREFIX => '>', '_GTE' => '>=', '_LT' => '<', '_LTE' => '<=', diff --git a/src/Form/Transformer/Operator/GreaterThanModelTransformer.php b/src/Form/Transformer/Operator/GreaterThanModelTransformer.php new file mode 100644 index 0000000..988a3a6 --- /dev/null +++ b/src/Form/Transformer/Operator/GreaterThanModelTransformer.php @@ -0,0 +1,13 @@ +addModelTransformer(new GreaterThanModelTransformer()); + } + + + public function getParent() + { + return TextType::class; + } +} From 1bf260747861592eb983404f0b2bead2d4bd580b Mon Sep 17 00:00:00 2001 From: Jean-Pascal Devierne Date: Thu, 6 Dec 2018 16:40:14 +0100 Subject: [PATCH 3/4] Added GTE, LT, LTE filter text types --- .../PostQueryBuilderSubscriber.php | 9 +++++--- .../GreaterThanOrEqualModelTransformer.php | 13 +++++++++++ .../Operator/LowerThanModelTransformer.php | 13 +++++++++++ .../LowerThanOrEqualModelTransformer.php | 13 +++++++++++ .../GreaterThanOrEqualFilterTextType.php | 23 +++++++++++++++++++ .../Type/Operator/LowerThanFilterTextType.php | 22 ++++++++++++++++++ .../LowerThanOrEqualFilterTextType.php | 23 +++++++++++++++++++ 7 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 src/Form/Transformer/Operator/GreaterThanOrEqualModelTransformer.php create mode 100644 src/Form/Transformer/Operator/LowerThanModelTransformer.php create mode 100644 src/Form/Transformer/Operator/LowerThanOrEqualModelTransformer.php create mode 100644 src/Form/Type/Operator/GreaterThanOrEqualFilterTextType.php create mode 100644 src/Form/Type/Operator/LowerThanFilterTextType.php create mode 100644 src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php diff --git a/src/EventListener/PostQueryBuilderSubscriber.php b/src/EventListener/PostQueryBuilderSubscriber.php index e8a8b31..16884fe 100644 --- a/src/EventListener/PostQueryBuilderSubscriber.php +++ b/src/EventListener/PostQueryBuilderSubscriber.php @@ -3,6 +3,9 @@ namespace AlterPHP\EasyAdminExtensionBundle\EventListener; use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\GreaterThanModelTransformer; +use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\GreaterThanOrEqualModelTransformer; +use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\LowerThanModelTransformer; +use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\LowerThanOrEqualModelTransformer; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Query\QueryException; @@ -17,9 +20,9 @@ class PostQueryBuilderSubscriber implements EventSubscriberInterface { protected static $operators = [ GreaterThanModelTransformer::OPERATOR_PREFIX => '>', - '_GTE' => '>=', - '_LT' => '<', - '_LTE' => '<=', + GreaterThanOrEqualModelTransformer::OPERATOR_PREFIX => '>=', + LowerThanModelTransformer::OPERATOR_PREFIX => '<', + LowerThanOrEqualModelTransformer::OPERATOR_PREFIX => '<=', ]; /** diff --git a/src/Form/Transformer/Operator/GreaterThanOrEqualModelTransformer.php b/src/Form/Transformer/Operator/GreaterThanOrEqualModelTransformer.php new file mode 100644 index 0000000..8d7b580 --- /dev/null +++ b/src/Form/Transformer/Operator/GreaterThanOrEqualModelTransformer.php @@ -0,0 +1,13 @@ +addModelTransformer(new GreaterThanOrEqualModelTransformer()); + } + + + public function getParent() + { + return TextType::class; + } +} diff --git a/src/Form/Type/Operator/LowerThanFilterTextType.php b/src/Form/Type/Operator/LowerThanFilterTextType.php new file mode 100644 index 0000000..2842d69 --- /dev/null +++ b/src/Form/Type/Operator/LowerThanFilterTextType.php @@ -0,0 +1,22 @@ +addModelTransformer(new LowerThanModelTransformer()); + } + + + public function getParent() + { + return TextType::class; + } +} diff --git a/src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php b/src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php new file mode 100644 index 0000000..ddad185 --- /dev/null +++ b/src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php @@ -0,0 +1,23 @@ +addModelTransformer(new LowerThanOrEqualModelTransformer()); + } + + + public function getParent() + { + return TextType::class; + } +} From 6951d94d8c7e4dec7b64b588f0fa9732b6a27d09 Mon Sep 17 00:00:00 2001 From: Jean-Pascal Devierne Date: Thu, 6 Dec 2018 16:50:56 +0100 Subject: [PATCH 4/4] PHP Cs Fixer --- src/EventListener/PostQueryBuilderSubscriber.php | 13 +++++++------ .../Operator/GreaterThanModelTransformer.php | 2 +- .../Operator/GreaterThanOrEqualModelTransformer.php | 2 +- .../Operator/LowerThanModelTransformer.php | 2 +- .../Operator/LowerThanOrEqualModelTransformer.php | 2 +- .../Traits/OperatorModelTransformerTrait.php | 9 ++++----- .../Type/Operator/GreaterThanFilterTextType.php | 1 - .../Operator/GreaterThanOrEqualFilterTextType.php | 2 -- src/Form/Type/Operator/LowerThanFilterTextType.php | 1 - .../Operator/LowerThanOrEqualFilterTextType.php | 2 -- 10 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/EventListener/PostQueryBuilderSubscriber.php b/src/EventListener/PostQueryBuilderSubscriber.php index 16884fe..28fb590 100644 --- a/src/EventListener/PostQueryBuilderSubscriber.php +++ b/src/EventListener/PostQueryBuilderSubscriber.php @@ -7,8 +7,8 @@ use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\LowerThanModelTransformer; use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\LowerThanOrEqualModelTransformer; use Doctrine\Common\Collections\Collection; -use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Query\QueryException; +use Doctrine\ORM\QueryBuilder; use EasyCorp\Bundle\EasyAdminBundle\Event\EasyAdminEvents; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\GenericEvent; @@ -167,7 +167,7 @@ protected function filterQueryBuilder(QueryBuilder $queryBuilder, string $field, // Multiple values leads to IN statement case $value instanceof Collection: case \is_array($value): - if (0 < count($value)) { + if (0 < \count($value)) { $filterDqlPart = $field.' IN (:'.$parameter.')'; } break; @@ -184,11 +184,11 @@ protected function filterQueryBuilder(QueryBuilder $queryBuilder, string $field, // Special case if value has an operatorPrefix case $operatorPrefix = $this->getOperatorPrefix($value): // get value without prefix - $value = substr($value, \strlen($operatorPrefix)); + $value = \substr($value, \strlen($operatorPrefix)); $operator = static::$operators[$operatorPrefix]; - $filterDqlPart = $field.' '. $operator .' :'.$parameter; + $filterDqlPart = $field.' '.$operator.' :'.$parameter; break; // Default is equality default: @@ -230,13 +230,14 @@ protected function isFilterAppliable(QueryBuilder $queryBuilder, string $field): protected function getOperatorPrefix($value): string { - $operatorPrefixes = array_keys(static::$operators); + $operatorPrefixes = \array_keys(static::$operators); foreach ($operatorPrefixes as $operatorPrefix) { - if (strpos($value, $operatorPrefix) === 0) { + if (0 === \strpos($value, $operatorPrefix)) { return $operatorPrefix; } } + return ''; } } diff --git a/src/Form/Transformer/Operator/GreaterThanModelTransformer.php b/src/Form/Transformer/Operator/GreaterThanModelTransformer.php index 988a3a6..622d378 100644 --- a/src/Form/Transformer/Operator/GreaterThanModelTransformer.php +++ b/src/Form/Transformer/Operator/GreaterThanModelTransformer.php @@ -7,7 +7,7 @@ class GreaterThanModelTransformer implements DataTransformerInterface { - const OPERATOR_PREFIX = "_GT"; + const OPERATOR_PREFIX = '_GT'; use OperatorModelTransformerTrait; } diff --git a/src/Form/Transformer/Operator/GreaterThanOrEqualModelTransformer.php b/src/Form/Transformer/Operator/GreaterThanOrEqualModelTransformer.php index 8d7b580..5355a92 100644 --- a/src/Form/Transformer/Operator/GreaterThanOrEqualModelTransformer.php +++ b/src/Form/Transformer/Operator/GreaterThanOrEqualModelTransformer.php @@ -7,7 +7,7 @@ class GreaterThanOrEqualModelTransformer implements DataTransformerInterface { - const OPERATOR_PREFIX = "_GTE"; + const OPERATOR_PREFIX = '_GTE'; use OperatorModelTransformerTrait; } diff --git a/src/Form/Transformer/Operator/LowerThanModelTransformer.php b/src/Form/Transformer/Operator/LowerThanModelTransformer.php index 2cd0c4a..0b4c480 100644 --- a/src/Form/Transformer/Operator/LowerThanModelTransformer.php +++ b/src/Form/Transformer/Operator/LowerThanModelTransformer.php @@ -7,7 +7,7 @@ class LowerThanModelTransformer implements DataTransformerInterface { - const OPERATOR_PREFIX = "_LT"; + const OPERATOR_PREFIX = '_LT'; use OperatorModelTransformerTrait; } diff --git a/src/Form/Transformer/Operator/LowerThanOrEqualModelTransformer.php b/src/Form/Transformer/Operator/LowerThanOrEqualModelTransformer.php index 288599d..35d4e7e 100644 --- a/src/Form/Transformer/Operator/LowerThanOrEqualModelTransformer.php +++ b/src/Form/Transformer/Operator/LowerThanOrEqualModelTransformer.php @@ -7,7 +7,7 @@ class LowerThanOrEqualModelTransformer implements DataTransformerInterface { - const OPERATOR_PREFIX = "_LTE"; + const OPERATOR_PREFIX = '_LTE'; use OperatorModelTransformerTrait; } diff --git a/src/Form/Transformer/Operator/Traits/OperatorModelTransformerTrait.php b/src/Form/Transformer/Operator/Traits/OperatorModelTransformerTrait.php index ad91380..4e079dc 100644 --- a/src/Form/Transformer/Operator/Traits/OperatorModelTransformerTrait.php +++ b/src/Form/Transformer/Operator/Traits/OperatorModelTransformerTrait.php @@ -6,9 +6,9 @@ trait OperatorModelTransformerTrait { public function transform($value) { - if (strpos($value, static::OPERATOR_PREFIX) !== 0) { + if (0 !== \strpos($value, static::OPERATOR_PREFIX)) { // remove prefix if set - $value = substr($value, \strlen(static::OPERATOR_PREFIX)) ; + $value = \substr($value, \strlen(static::OPERATOR_PREFIX)); } return $value; @@ -16,12 +16,11 @@ public function transform($value) public function reverseTransform($value) { - if (strpos($value, static::OPERATOR_PREFIX) !== 0) { + if (0 !== \strpos($value, static::OPERATOR_PREFIX)) { // add prefix if not set - $value = static::OPERATOR_PREFIX . $value; + $value = static::OPERATOR_PREFIX.$value; } return $value; } - } diff --git a/src/Form/Type/Operator/GreaterThanFilterTextType.php b/src/Form/Type/Operator/GreaterThanFilterTextType.php index d027616..e440725 100644 --- a/src/Form/Type/Operator/GreaterThanFilterTextType.php +++ b/src/Form/Type/Operator/GreaterThanFilterTextType.php @@ -14,7 +14,6 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->addModelTransformer(new GreaterThanModelTransformer()); } - public function getParent() { return TextType::class; diff --git a/src/Form/Type/Operator/GreaterThanOrEqualFilterTextType.php b/src/Form/Type/Operator/GreaterThanOrEqualFilterTextType.php index dec9ded..c672c6a 100644 --- a/src/Form/Type/Operator/GreaterThanOrEqualFilterTextType.php +++ b/src/Form/Type/Operator/GreaterThanOrEqualFilterTextType.php @@ -2,7 +2,6 @@ namespace AlterPHP\EasyAdminExtensionBundle\Form\Type\Operator; - use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\GreaterThanOrEqualModelTransformer; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; @@ -15,7 +14,6 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->addModelTransformer(new GreaterThanOrEqualModelTransformer()); } - public function getParent() { return TextType::class; diff --git a/src/Form/Type/Operator/LowerThanFilterTextType.php b/src/Form/Type/Operator/LowerThanFilterTextType.php index 2842d69..c685dbc 100644 --- a/src/Form/Type/Operator/LowerThanFilterTextType.php +++ b/src/Form/Type/Operator/LowerThanFilterTextType.php @@ -14,7 +14,6 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->addModelTransformer(new LowerThanModelTransformer()); } - public function getParent() { return TextType::class; diff --git a/src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php b/src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php index ddad185..85269ab 100644 --- a/src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php +++ b/src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php @@ -2,7 +2,6 @@ namespace AlterPHP\EasyAdminExtensionBundle\Form\Type\Operator; - use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\LowerThanOrEqualModelTransformer; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; @@ -15,7 +14,6 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->addModelTransformer(new LowerThanOrEqualModelTransformer()); } - public function getParent() { return TextType::class;