Sonata filter for ENUM field type
I'm using fresh/DoctrineEnumBundle for managing ENUM fields in database.
Create AbstractBaseFilter.php
<?php
namespace AcmeBundle\Admin\Filter;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use Sonata\DoctrineORMAdminBundle\Filter\Filter;
use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList;
/**
* Base filter
*/
abstract class AbstractBaseFilter extends Filter
{
/**
* {@inheritdoc}
*/
public function filter(ProxyQueryInterface $queryBuilder, $alias, $field, $data)
{
if (!$data || !is_array($data) || !array_key_exists('type', $data) || !array_key_exists('value', $data)) {
return;
}
if (in_array($data['value'], $this->getValues())) {
$parameterName = $this->getNewParameterName($queryBuilder);
$this->applyWhere($queryBuilder, sprintf('%s.%s = :%s', $alias, $field, $parameterName));
$queryBuilder->setParameter($parameterName, $data['value']);
} else {
return;
}
}
/**
* {@inheritdoc}
*/
public function getDefaultOptions()
{
return [];
}
/**
* {@inheritdoc}
*/
public function getFieldType()
{
return $this->getOption('field_type', 'choice');
}
/**
* {@inheritdoc}
*/
public function getFieldOptions()
{
return $this->getOption('choices', [
'required' => false,
'choice_list' => new ChoiceList($this->getValues(), array_values($this->getChoices())),
]);
}
/**
* {@inheritdoc}
*/
public function getRenderSettings()
{
return [
'sonata_type_filter_default', [
'operator_type' => 'sonata_type_equal',
'field_type' => $this->getFieldType(),
'field_options' => $this->getFieldOptions(),
'label' => $this->getLabel(),
],
];
}
/**
* Get values
*
* @return array
*/
abstract protected function getValues();
/**
* Get choices
*
* @return array
*/
abstract protected function getChoices();
}
Create and register custom ENUM type
Create custom filter
<?php
namespace AcmeBundle\Admin\Filter;
use AcmeBundle\DBAL\Types\MyEnumType;
/**
* MyEnumTypeFilter class
*/
class MyEnumTypeFilter extends AbstractBaseFilter
{
/**
* {@inheritdoc}
*/
protected function getValues()
{
return MyEnumType::getValues();
}
/**
* {@inheritdoc}
*/
protected function getChoices()
{
return MyEnumType::getChoices();
}
}
Register filter as service
# AcmeBundle/Resources/config/admin.yml
services:
admin.filter.my_enum_type:
class: AcmeBundle\Admin\Filter\MyEnumTypeFilter
tags:
- { name: sonata.admin.filter.type, alias: filter_my_enum_type }
Use filter in admin class
<?php
namespace AcmeBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
/**
* My custom admin class
*/
class MyCustomAdmin extends Admin
{
/**
* {@inheritdoc}
*/
protected function configureDatagridFilters(DatagridMapper $dataGridMapper)
{
$dataGridMapper
->add('id')
...
->add('status', 'filter_my_enum_type');
}
...
}
Enjoy filter for ENUM type :smile: