Parlons de votre projet
PHP Symfony Sonata

Symfony 4 / Sonata ajouter un filtre lié à 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 filt...

Symfony 4 / Sonata ajouter un filtre lié à 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))

Adapter l’exemple à la version installée

Les exemples Symfony et Sonata restent attachés aux versions indiquées dans l’article. Symfony 4.x et Symfony 6.2 ne sont plus maintenus : pour un projet actuel, utilisez une branche maintenue et la documentation correspondant exactement à vos dépendances.

php bin/console about
composer show symfony/framework-bundle sonata-project/admin-bundle

Avant de reprendre le code, contrôlez les signatures, les services, les routes et les templates concernés. Ajoutez ensuite un test fonctionnel couvrant les autorisations, le code HTTP et le résultat visible.

Référence : versions Symfony maintenues.

Partager cet article