Symfony 4 / Sonata agregar un filtro vinculado a una entidad OneToMany

Los filtros se gestionan en el método configureDatagridFilters

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



Se puede añadir un filtro simple en un título o cualquier parámetro de nuestra entidad.
El parámetro show_filter permite mostrarlo al cargar la página. Combinado con el valor de $filters, se puede especificar que se mantenga el elemento mostrado después del envío del filtro.

Por ejemplo, se puede configurar el filtro para que se muestre permanentemente:

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

O para mostrarlo solo si ha sido utilizado:

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

Para una relación oneToMany, si tu entidad está configurada correctamente, puedes simplemente configurarla de la siguiente manera:

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

Básicamente, no hay nada que hacer. Pero podríamos necesitar filtrar los valores. En este caso, utilizaremos doctrine para modificar la consulta de selección para los valores:

->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"]."%'"));
		                }
            ])

También podríamos querer hacer una lista construida dinámicamente por nosotros mismos:

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

Tenga en cuenta que los marcadores de posición `{{code_placeholder_X}}` se dejaron sin traducir, ya que parecen representar marcadores de posición para fragmentos de código que deben ser reemplazados por código real, el cual típicamente no se debe traducir. Si requiere que se traduzcan las instrucciones o comentarios circundantes dentro de los fragmentos de código, por favor proporcione el código real o los comentarios.