Desarrollaremos aquí todas las manipulaciones para construir una interfaz de muchos a muchos a través de Sonata.
Tomaremos como ejemplo una gestión de zonas con una conexión por departamentos. Cada zona está así constituida por múltiples conexiones con la tabla de departamentos.
En MysqlWorkbench, se ve así:
Para generar las entidades, utilizamos el siguiente comando:
php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity

A continuación, creamos los setters y getters en nuestras entidades utilizando el comando:
php bin/console make:entity --regenerate App

Ahora solo queda generar nuestro CRUD de Sonata sin olvidar de limpiar la caché.
php bin/console make:sonata:admin App/Entity/ZxZone
php bin/console cache:clear

Nuestra interfaz será creada y el servicio también. Todavía tendremos que realizar algunas manipulaciones.
1 - Quitar el ID de nuestro formulario de creación de registros y agregar nuestro campo de departamento
//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,
]);
}
En la definición del departamento pedimos explícitamente mostrar el campo de etiqueta en nuestra lista, a través del parámetro "choice_label".
Esto nos permite mostrar una etiqueta más agradable que solo el id. Pero para esto, debemos agregar los siguientes métodos en la entidad del departamento.
//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;
}
