Skip to content

Commit

Permalink
Merge 0947674 into abe07f2
Browse files Browse the repository at this point in the history
  • Loading branch information
napestershine committed Jun 28, 2020
2 parents abe07f2 + 0947674 commit a533ed7
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 9 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"doctrine/doctrine-bundle": "^1.8 || ^2.0",
"doctrine/orm": "^2.5",
"doctrine/persistence": "^1.3.4",
"sonata-project/admin-bundle": "^3.68",
"sonata-project/admin-bundle": "^3.71",
"sonata-project/exporter": "^1.11.0 || ^2.0",
"sonata-project/form-extensions": "^0.1 || ^1.4",
"symfony/config": "^4.4",
Expand Down
29 changes: 21 additions & 8 deletions src/Filter/StringFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@

use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use Sonata\AdminBundle\Form\Type\Filter\ChoiceType;
use Sonata\AdminBundle\Form\Type\Operator\ContainsOperatorType;
use Sonata\AdminBundle\Form\Type\Operator\StringOperatorType;

class StringFilter extends Filter
{
public const CHOICES = [
ContainsOperatorType::TYPE_CONTAINS => 'LIKE',
ContainsOperatorType::TYPE_NOT_CONTAINS => 'NOT LIKE',
ContainsOperatorType::TYPE_EQUAL => '=',
StringOperatorType::TYPE_CONTAINS => 'LIKE',
StringOperatorType::TYPE_STARTS_WITH => 'LIKE',
StringOperatorType::TYPE_ENDS_WITH => 'LIKE',
StringOperatorType::TYPE_NOT_CONTAINS => 'NOT LIKE',
StringOperatorType::TYPE_EQUAL => '=',
];

public function filter(ProxyQueryInterface $queryBuilder, $alias, $field, $data)
Expand All @@ -37,7 +39,7 @@ public function filter(ProxyQueryInterface $queryBuilder, $alias, $field, $data)
return;
}

$data['type'] = !isset($data['type']) ? ContainsOperatorType::TYPE_CONTAINS : $data['type'];
$data['type'] = !isset($data['type']) ? StringOperatorType::TYPE_CONTAINS : $data['type'];

$operator = $this->getOperator((int) $data['type']);

Expand All @@ -56,22 +58,33 @@ public function filter(ProxyQueryInterface $queryBuilder, $alias, $field, $data)
$or->add(sprintf('LOWER(%s.%s) %s :%s', $alias, $field, $operator, $parameterName));
}

if (ContainsOperatorType::TYPE_NOT_CONTAINS === $data['type']) {
if (StringOperatorType::TYPE_NOT_CONTAINS === $data['type']) {
$or->add($queryBuilder->expr()->isNull(sprintf('%s.%s', $alias, $field)));
}

$this->applyWhere($queryBuilder, $or);

if (ContainsOperatorType::TYPE_EQUAL === $data['type']) {
if (StringOperatorType::TYPE_EQUAL === $data['type']) {
$queryBuilder->setParameter(
$parameterName,
$this->getOption('case_sensitive') ? $data['value'] : mb_strtolower($data['value'])
);
} else {
switch ($data['type']) {
case StringOperatorType::TYPE_STARTS_WITH:
$format = '%s%%';
break;
case StringOperatorType::TYPE_ENDS_WITH:
$format = '%%%s';
break;
default:
$format = $this->getOption('format');
}

$queryBuilder->setParameter(
$parameterName,
sprintf(
$this->getOption('format'),
$format,
$this->getOption('case_sensitive') ? $data['value'] : mb_strtolower($data['value'])
)
);
Expand Down
27 changes: 27 additions & 0 deletions tests/Filter/StringFilterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

use PHPUnit\Framework\TestCase;
use Sonata\AdminBundle\Form\Type\Operator\ContainsOperatorType;
use Sonata\AdminBundle\Form\Type\Operator\StringOperatorType;
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;
use Sonata\DoctrineORMAdminBundle\Filter\StringFilter;

Expand Down Expand Up @@ -67,6 +68,32 @@ public function testContains(): void
$this->assertTrue($filter->isActive());
}

public function testStartsWith(): void
{
$filter = new StringFilter();
$filter->initialize('field_name', ['format' => '%s']);

$builder = new ProxyQuery(new QueryBuilder());
$this->assertSame([], $builder->query);

$filter->filter($builder, 'alias', 'field', ['value' => 'asd', 'type' => StringOperatorType::TYPE_STARTS_WITH]);
$this->assertSame(['alias.field LIKE :field_name_0'], $builder->query);
$this->assertSame(['field_name_0' => 'asd%'], $builder->parameters);
}

public function testEndsWith(): void
{
$filter = new StringFilter();
$filter->initialize('field_name', ['format' => '%s']);

$builder = new ProxyQuery(new QueryBuilder());
$this->assertSame([], $builder->query);

$filter->filter($builder, 'alias', 'field', ['value' => 'asd', 'type' => StringOperatorType::TYPE_ENDS_WITH]);
$this->assertSame(['alias.field LIKE :field_name_0'], $builder->query);
$this->assertSame(['field_name_0' => '%asd'], $builder->parameters);
}

public function testNotContains(): void
{
$filter = new StringFilter();
Expand Down

0 comments on commit a533ed7

Please sign in to comment.