5. Filter field definition¶
These fields are displayed inside the filter box. They allow you to filter the list of entities by a number of different methods.
A filter instance is always linked to a Form Type, there are 7 types available:
- SonataAdminBundleFormTypeFilterNumberType: display 2 widgets, the operator ( >, >=, <=, <, =) and the value,
- SonataAdminBundleFormTypeFilterChoiceType: display 2 widgets, the operator (yes and no) and the value,
- SonataAdminBundleFormTypeFilterDefaultType: display 2 widgets, an hidden operator (can be changed on demand) and the value,
- SonataAdminBundleFormTypeFilterDateType: display 2 widgets, the operator ( >, >=, <= , <, =) and the value,
- SonataAdminBundleFormTypeFilterDateRangeType: display 3 widgets, the operator (between and not between) and the two values,
- SonataAdminBundleFormTypeFilterDateTimeType: display 2 widgets, the operator ( >, >=, <= , <, =) and the value,
- SonataAdminBundleFormTypeFilterDateTimeRangeType: display 3 widgets, the operator (between and not between) and the two values,
The Form Type configuration is provided by the filter itself.
But they can be tweaked in the configureDatagridFilters process with the add method.
The add method accepts 4 arguments:
- the field name, fields of relations (of relations of relations … ) can be specified with a dot-separated syntax,
- the filter type, the filter name,
- the filter options, the options related to the filter,
- the field description options, the options related to the field.
5.1. Available filter types¶
For now, only Doctrine ORM filters are available:
Sonata\DoctrineORMAdminBundle\Filter\BooleanFilter: depends on theSonata\AdminBundle\Form\Type\Filter\DefaultTypeForm Type, renders yes or no field,Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter: depends on theSonata\AdminBundle\Form\Type\Filter\DefaultTypeForm Type, types can be configured as needed,Sonata\DoctrineORMAdminBundle\Filter\ChoiceFilter: depends on theSonata\AdminBundle\Form\Type\Filter\ChoiceTypeForm Type,Sonata\DoctrineORMAdminBundle\Filter\CountFilter: depends on theSonata\AdminBundle\Form\Type\Filter\NumberTypeForm Type,Sonata\DoctrineORMAdminBundle\Filter\NumberFilter: depends on theSonata\AdminBundle\Form\Type\Filter\NumberTypeForm Type,Sonata\DoctrineORMAdminBundle\Filter\ModelAutocompleteFilter: usesSonata\AdminBundle\Form\Type\Filter\ModelAutocompleteTypeform type, can be used as replacement ofSonata\DoctrineORMAdminBundle\Filter\ModelFilterto handle too many items that cannot be loaded into memory.Sonata\DoctrineORMAdminBundle\Filter\StringFilter: depends on theSonata\AdminBundle\Form\Type\Filter\ChoiceTypeForm Type,Sonata\DoctrineORMAdminBundle\Filter\StringListFilter: depends on theSonata\AdminBundle\Form\Type\Filter\ChoiceTypeForm Type,Sonata\DoctrineORMAdminBundle\Filter\DateFilter: depends on theSonata\AdminBundle\Form\Type\Filter\DateTypeForm Type, renders a date field,Sonata\DoctrineORMAdminBundle\Filter\DateRangeFilter: depends on theSonata\AdminBundle\Form\Type\Filter\DateRangeTypeForm Type, renders a 2 date fields,Sonata\DoctrineORMAdminBundle\Filter\DateTimeFilter: depends on theSonata\AdminBundle\Form\Type\Filter\DateTimeTypeForm Type, renders a datetime field,Sonata\DoctrineORMAdminBundle\Filter\DateTimeRangeFilter: depends on theSonata\AdminBundle\Form\Type\Filter\DateTimeRangeTypeForm Type, renders a 2 datetime fields,Sonata\DoctrineORMAdminBundle\Filter\ClassFilter: depends on theSonata\AdminBundle\Form\Type\Filter\DefaultTypeForm type, renders a choice list field.Sonata\DoctrineORMAdminBundle\Filter\NullFilter: depends on theSonata\AdminBundle\Form\Type\Filter\DefaultTypeForm type, renders a choice list field.
5.2. Example¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | namespace Sonata\NewsBundle\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
final class PostAdmin extends AbstractAdmin
{
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('title')
->add('enabled')
->add('tags', null, [
'field_options' => ['expanded' => true, 'multiple' => true],
]);
}
}
|
5.3. BooleanFilter¶
The boolean filter has additional options:
treat_null_as- set tofalse,nullvalues in database will be considered as falsy. Set totrue,nullvalues in database will be considered as truthy. By defaultnullis used.
5.4. StringFilter¶
The string filter has additional options:
force_case_insensitivity- set totrueto make the search case insensitive. By defaultfalseis used, letting the database to apply its default behavior.trim- use one ofSonata\DoctrineORMAdminBundle\Filter\TRIM_*constants to control the clearing of blank spaces around in the value. By defaultSonata\DoctrineORMAdminBundle\Filter\TRIM_BOTHis used.allow_empty- set totrueto enable search by empty value. By defaultfalseis used.global_search- set totrueto enable the use of this filter in the global search. By defaulttrueis used.
5.5. StringListFilter¶
This filter is made for filtering on values saved in databases as serialized arrays of strings with the
@ORM\Column(type="array") annotation. It is recommended to use another table and OneToMany relations
if you want to make complex SQL queries or if your table is too big and you get performance issues but
this filter can provide some basic queries:
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('labels', StringListFilter::class, [
'field_type' => ChoiceType::class,
'field_options' => [
'choices' => [
'patch' => 'patch',
'minor' => 'minor',
'major' => 'major',
'approved' => 'approved',
// ...
],
'multiple' => true,
],
]);
}
Note
The filter can give bad results with associative arrays since it is not easy to distinguish between keys and values for a serialized associative array.
5.6. ModelAutocompleteFilter¶
This filter type uses Sonata\AdminBundle\Form\Type\ModelAutocompleteType form type. It renders an input with select2 autocomplete feature.
Can be used as replacement of Sonata\DoctrineORMAdminBundle\Filter\ModelFilter to handle too many related items that cannot be loaded into memory.
This form type requires property option. See documentation of Sonata\AdminBundle\Form\Type\ModelAutocompleteType for all available options for this form type:
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('category', ModelAutocompleteFilter::class, [
// in related CategoryAdmin there must be datagrid filter on `title` field to make the autocompletion work
'field_options' => ['property'=>'title'],
]);
}
5.7. DateRangeFilter¶
The Sonata\DoctrineORMAdminBundle\Filter\DateRangeFilter filter renders two fields to filter all records between two dates.
If only one date is set it will filter for all records until or since the given date:
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter->add('created', DateRangeFilter::class);
}
5.8. Timestamps¶
Sonata\DoctrineORMAdminBundle\Filter\DateFilter, Sonata\DoctrineORMAdminBundle\Filter\DateRangeFilter, Sonata\DoctrineORMAdminBundle\Filter\DateTimeFilter and Sonata\DoctrineORMAdminBundle\Filter\DateTimeRangeFilter
support filtering of timestamp fields by specifying 'input_type' => 'timestamp' option:
namespace Sonata\NewsBundle\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\DoctrineORMAdminBundle\Filter\DateTimeRangeFilter;
final class PostAdmin extends AbstractAdmin
{
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('timestamp', DateTimeRangeFilter::class, ['input_type' => 'timestamp']);
}
}
5.9. ClassFilter¶
Sonata\DoctrineORMAdminBundle\Filter\ClassFilter supports filtering on hierarchical entities. You need to specify the sub_classes option:
namespace Sonata\NewsBundle\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\DoctrineORMAdminBundle\Filter\ClassFilter;
final class PostAdmin extends AbstractAdmin
{
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('type', ClassFilter::class, ['sub_classes' => $this->getSubClasses()]);
}
}
5.10. NullFilter¶
Sonata\DoctrineORMAdminBundle\Filter\NullFilter supports filtering for null entity fields:
namespace Sonata\NewsBundle\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Filter\NullFilter;
final class PostAdmin extends AbstractAdmin
{
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('deleted', NullFilter::class, ['field_name' => 'deletedAt']);
}
}
The inverse option can be used to filter values that are not null.
5.11. Advanced usage¶
5.11.1. Filtering by sub entity properties¶
If you need to filter your base entities by the value of a sub entity property, you can simply use the dot-separated notation:
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
final class UserAdmin extends AbstractAdmin
{
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('id')
->add('firstName')
->add('lastName')
->add('address.street')
->add('address.ZIPCode')
->add('address.town');
}
}
Note
This only makes sense when the prefix path is made of entities, not collections.
5.11.2. Label¶
You can customize the label which appears on the main widget by using a label option:
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('tags', null, [
'label' => 'les tags'
'field_options' => ['expanded' => true, 'multiple' => true],
]);
}
5.11.3. Callback¶
To create a custom callback filter, two methods need to be implemented:
- one to define the field type,
- one to define how to use the field’s value.
The latter shall return whether the filter actually is applied to the queryBuilder or not.
In this example, getWithOpenCommentField and getWithOpenCommentFilter implement this functionality:
namespace Sonata\NewsBundle\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface;
use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
use Application\Sonata\NewsBundle\Entity\Comment;
final class PostAdmin extends AbstractAdmin
{
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('title')
->add('enabled')
->add('tags', null, [
'field_options' => ['expanded' => true, 'multiple' => true],
])
->add('author')
->add('with_open_comments', CallbackFilter::class, [
// 'callback' => [$this, 'getWithOpenCommentFilter'],
'callback' => static function(ProxyQueryInterface $query, string $alias, string $field, array $data): bool {
if (!$data['value']) {
return false;
}
$query
->leftJoin(sprintf('%s.comments', $alias), 'c')
->andWhere('c.status = :status')
->setParameter('status', Comment::STATUS_MODERATE);
return true;
},
'field_type' => 'checkbox'
]);
}
public function getWithOpenCommentFilter(ProxyQueryInterface $query, string $alias, string $field, array $data): bool
{
if (!$data['value']) {
return false;
}
$query
->leftJoin(sprintf('%s.comments', $alias), 'c')
->andWhere('c.status = :status')
->setParameter('status', Comment::STATUS_MODERATE);
return true;
}
}