Skip to content

Commit

Permalink
Merge 6951d94 into 452fe30
Browse files Browse the repository at this point in the history
  • Loading branch information
CheapHasz committed Dec 6, 2018
2 parents 452fe30 + 6951d94 commit dc6a8b4
Show file tree
Hide file tree
Showing 10 changed files with 197 additions and 2 deletions.
37 changes: 35 additions & 2 deletions src/EventListener/PostQueryBuilderSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
*/
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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 '';
}
}
13 changes: 13 additions & 0 deletions src/Form/Transformer/Operator/GreaterThanModelTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator;

use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\Traits\OperatorModelTransformerTrait;
use Symfony\Component\Form\DataTransformerInterface;

class GreaterThanModelTransformer implements DataTransformerInterface
{
const OPERATOR_PREFIX = '_GT';

use OperatorModelTransformerTrait;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator;

use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\Traits\OperatorModelTransformerTrait;
use Symfony\Component\Form\DataTransformerInterface;

class GreaterThanOrEqualModelTransformer implements DataTransformerInterface
{
const OPERATOR_PREFIX = '_GTE';

use OperatorModelTransformerTrait;
}
13 changes: 13 additions & 0 deletions src/Form/Transformer/Operator/LowerThanModelTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator;

use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\Traits\OperatorModelTransformerTrait;
use Symfony\Component\Form\DataTransformerInterface;

class LowerThanModelTransformer implements DataTransformerInterface
{
const OPERATOR_PREFIX = '_LT';

use OperatorModelTransformerTrait;
}
13 changes: 13 additions & 0 deletions src/Form/Transformer/Operator/LowerThanOrEqualModelTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator;

use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\Traits\OperatorModelTransformerTrait;
use Symfony\Component\Form\DataTransformerInterface;

class LowerThanOrEqualModelTransformer implements DataTransformerInterface
{
const OPERATOR_PREFIX = '_LTE';

use OperatorModelTransformerTrait;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\Traits;

trait OperatorModelTransformerTrait
{
public function transform($value)
{
if (0 !== \strpos($value, static::OPERATOR_PREFIX)) {
// remove prefix if set
$value = \substr($value, \strlen(static::OPERATOR_PREFIX));
}

return $value;
}

public function reverseTransform($value)
{
if (0 !== \strpos($value, static::OPERATOR_PREFIX)) {
// add prefix if not set
$value = static::OPERATOR_PREFIX.$value;
}

return $value;
}
}
21 changes: 21 additions & 0 deletions src/Form/Type/Operator/GreaterThanFilterTextType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace AlterPHP\EasyAdminExtensionBundle\Form\Type\Operator;

use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\GreaterThanModelTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class GreaterThanFilterTextType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addModelTransformer(new GreaterThanModelTransformer());
}

public function getParent()
{
return TextType::class;
}
}
21 changes: 21 additions & 0 deletions src/Form/Type/Operator/GreaterThanOrEqualFilterTextType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

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;
use Symfony\Component\Form\FormBuilderInterface;

class GreaterThanOrEqualFilterTextType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addModelTransformer(new GreaterThanOrEqualModelTransformer());
}

public function getParent()
{
return TextType::class;
}
}
21 changes: 21 additions & 0 deletions src/Form/Type/Operator/LowerThanFilterTextType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace AlterPHP\EasyAdminExtensionBundle\Form\Type\Operator;

use AlterPHP\EasyAdminExtensionBundle\Form\Transformer\Operator\LowerThanModelTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class LowerThanFilterTextType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addModelTransformer(new LowerThanModelTransformer());
}

public function getParent()
{
return TextType::class;
}
}
21 changes: 21 additions & 0 deletions src/Form/Type/Operator/LowerThanOrEqualFilterTextType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

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;
use Symfony\Component\Form\FormBuilderInterface;

class LowerThanOrEqualFilterTextType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addModelTransformer(new LowerThanOrEqualModelTransformer());
}

public function getParent()
{
return TextType::class;
}
}

0 comments on commit dc6a8b4

Please sign in to comment.