Parlons de votre projet
PHP Symfony Sonata

Symfony 4 / Sonata : créer une administration ManyToMany

Nous allons ici développer l’ensemble des manipulations pour construire une interface many to many via Sonata.Nous prendrons comme exemple une gestion de zones avec une liaison par départements. Chaque zones est donc constitué d&r...

Symfony 4 / Sonata : créer une administration ManyToMany

Nous allons ici développer l’ensemble des manipulations pour construire une interface many to many via Sonata.
Nous prendrons comme exemple une gestion de zones avec une liaison par départements. Chaque zones est donc constitué d’un liaison multiple avec la table département.

Sous MysqlWorkbench, cela donne ceci :

Sélection_123

Pour générer les entity, nous utilisons la commande suivante :

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity
Sélection_124

Ensuite, nous créons les setter et getter dans nos entity via la commande :

php bin/console make:entity --regenerate App
Sélection_125-1

Il ne nous reste plus qu’a générer notre CRUD sonata sans oublier de vider le cache.

php bin/console make:sonata:admin App/Entity/ZxZone
php bin/console cache:clear
Sélection_126

Notre interface sera créé et le service aussi. Il nous faudra tout de même faire quelques manipulations.

1 – Supprimer l’ID de notre formulaire de création d’enregistrement et ajouter notre champs département

//ajouter le use suivant
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

//supprimez l'id, et ajouter la liaison département
  protected function configureFormFields(FormMapper $formMapper): void
    {
       $formMapper
           //->add('id')
            ->add('label')
            ->add('code')
            ->add('departement', EntityType::class, [
                'class' => 'App\Entity\Departement',
                'choice_label' => 'label',
                'label' => 'Départements',
                'required' => false,
                'by_reference' => false,
                'multiple' => true,
                'expanded' => false,
            ]);
    }

Dans la définition de département nous demandons explicitement d’afficher le champs label dans notre liste, via le paramètre « choice_label ».

Cela nous permet d’afficher un label plus sympa que juste l’id. Mais pour cela, il faut ajouter les méthodes suivantes dans l’entity departement.

//Permet d'afficher un nom plus sympa dans les messages du CRUD
    public function __toString(): ?string
    {
        return $this->id." : ".$this->nomClairRiche;
    }
//Permet d'afficher un label dans notre liste de configuration
    public function getLabel(): ?string
    {
        return $this->id." : ".$this->nomClairRiche;
    }
on2many

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