4. Filter field definition¶
4.1. Available filter types¶
- sonata_search_elastica_boolean: depends on the
sonata_type_filter_defaultForm Type, renders yes or no field, - sonata_search_elastica_callback: depends on the
sonata_type_filter_defaultForm Type, - sonata_search_elastica_choice: depends on the
sonata_type_filter_defaultForm Type, - sonata_search_elastica_string: depends on the
sonata_type_filter_choiceForm Type, - sonata_search_elastica_number: depends on the
sonata_type_filter_numberForm Type, - sonata_search_elastica_date : depends on the
sonata_type_filter_dateFrom Type, renders a date field, - sonata_search_elastica_date_range : depends on the
sonata_type_filter_date_rangeFrom Type, renders a 2 date fields, - sonata_search_elastica_datetime : depends on the
sonata_type_filter_datetimeFrom Type, renders a datetime field, - sonata_search_elastica_datetime_range : depends on the
sonata_type_filter_datetime_rangeFrom Type, renders a 2 datetime fields.
4.1.1. Callback¶
To create a custom callback filter, you just need to set the “callback” filter option
to a valid callback function. First argument of this function will be
Sonata\AdminSearchBundle\ProxyQuery\ElasticaProxyQuery instance which could be
modified according to your needs:
namespace Sonata\NewsBundle\Admin;
Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminSearchBundle\ProxyQuery\ElasticaProxyQuery;
final class PostAdmin extends AbstractAdmin
{
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('title')
->add('name', Sonata\AdminSearchBundle\Filter\CallbackFilter::class, [
'callback' => function (ElasticaProxyQuery $query, $alias, $field, $data) {
if (!$data || !is_array($data) || !array_key_exists('value', $data)) {
return;
}
$queryBuilder = new \Elastica\Query\Builder();
$queryBuilder
->fieldOpen('multi_match')
->field('query', trim($data['value']))
->field('fields', ['name', 'name.std'])
->field('operator', 'and')
->fieldClose();
$query->addMust($queryBuilder);
}
])
;
}
}
4.1.2. Date¶
To make query on date/datetime type, you can use one of the sonata_search_elastica_date filter types. For example if you have a date in the ISO 8601 date format:
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('date', Sonata\AdminSearchBundle\Filter\DateTimeFilter::class, null, 'datetime', [
'format' => 'c',
])
;
}
The format must be a string formatted according to the php format date and be the one used
to map the data in elasticsearch. If it is not the same, ElasticSearch will raise an exception
failed to parse date field [15/05/28] Invalid format.