Symfony 4 / Sonata ajouter un filtre lié a une entité OneToMany

Les filtres sont géré dans la méthode configureDatagridFilters

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
	{
$filers=$datagridMapper->getAdmin()->getFilterParameters();
}



On peu rajouter un filtre simple sur un titre ou n’importe quel paramètre de notre entité.
Le paramètre show_filter permet d’afficher celui-ci au chargement de la page. Combiné avec la valeur de $filters on peut spécifier de garder l’élément affiché après soumission du filtre.

Par axample , on peut dire d’afficher en permanence le filtre :

$datagridMapper
            ->add('title', null, ['show_filter' => true , 'label' => 'Titre'])

Ou alors dire de l’afficher uniquement si il a été utilisé

->add('enabled',null,['show_filter' =>!empty($filers['enabled']['value'])?true:null, 'label' => 'Actvé'])

Pour une liaison oneToMany, nous allons si votre entité est correctement configuré, vous pouvez configurer simplement comme suit :

$datagridMapper->add('field', null, ['show_filter' => true , 'label' => 'nom du champs']);

En gros il n’y a rien a faire. Mais on pourrais avoir besoin de filtrer les valeurs. Dans ce cas, on utilisera doctrine pour modifier la requête de sélection des valeurs :

->add('slug', 'doctrine_orm_callback', ['show_filter' =>!empty($filers['slug']['value'])?true:null,  'label' => 'SEO Slug',
                'callback'  => function($queryBuilder, $alias, $field, $value)
                        {
                            $queryBuilder->andWhere($queryBuilder->expr()->like('o.slug', "'%".$value["value"]."%'"));
		                }
            ])

On pourrais aussi vouloir faire une liste construit dynamiquement par nos soins :

 ->add('liste', 'doctrine_orm_choice', array(
                'label' => 'ma liste'),
                'choice',
                array(
                    'choices' => array(
                        'label value1' => 'value1',
                        'label value2' => 'value2',
                    ),
                    'expanded' => true,
                    'multiple' => true))