diff --git a/src/EventListener/PostQueryBuilderSubscriber.php b/src/EventListener/PostQueryBuilderSubscriber.php index 93073285..28fb5909 100644 --- a/src/EventListener/PostQueryBuilderSubscriber.php +++ b/src/EventListener/PostQueryBuilderSubscriber.php @@ -2,9 +2,13 @@ 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; +use Doctrine\ORM\QueryBuilder; use EasyCorp\Bundle\EasyAdminBundle\Event\EasyAdminEvents; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\GenericEvent; @@ -14,6 +18,13 @@ */ class PostQueryBuilderSubscriber implements EventSubscriberInterface { + protected static $operators = [ + GreaterThanModelTransformer::OPERATOR_PREFIX => '>', + GreaterThanOrEqualModelTransformer::OPERATOR_PREFIX => '>=', + LowerThanModelTransformer::OPERATOR_PREFIX => '<', + LowerThanOrEqualModelTransformer::OPERATOR_PREFIX => '<=', + ]; + /** * @var \AlterPHP\EasyAdminExtensionBundle\Helper\ListFormFiltersHelper */ @@ -156,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; @@ -170,6 +181,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 +227,17 @@ protected function isFilterAppliable(QueryBuilder $queryBuilder, string $field): return true; } + + protected function getOperatorPrefix($value): string + { + $operatorPrefixes = \array_keys(static::$operators); + + foreach ($operatorPrefixes as $operatorPrefix) { + if (0 === \strpos($value, $operatorPrefix)) { + return $operatorPrefix; + } + } + + return ''; + } } diff --git a/src/Form/Transformer/Operator/GreaterThanModelTransformer.php b/src/Form/Transformer/Operator/GreaterThanModelTransformer.php new file mode 100644 index 00000000..622d378a --- /dev/null +++ b/src/Form/Transformer/Operator/GreaterThanModelTransformer.php @@ -0,0 +1,13 @@ +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 new file mode 100644 index 00000000..c672c6a5 --- /dev/null +++ b/src/Form/Type/Operator/GreaterThanOrEqualFilterTextType.php @@ -0,0 +1,21 @@ +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 00000000..c685dbcb --- /dev/null +++ b/src/Form/Type/Operator/LowerThanFilterTextType.php @@ -0,0 +1,21 @@ +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 00000000..85269abe --- /dev/null +++ b/src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php @@ -0,0 +1,21 @@ +addModelTransformer(new LowerThanOrEqualModelTransformer()); + } + + public function getParent() + { + return TextType::class; + } +}