Imbriquer les formulaires avec des champs à remplir

116 views
Skip to first unread message

MINKOUE OBAME Anouchka

unread,
Feb 26, 2020, 5:44:21 PM2/26/20
to Association Francophone des Utilisateurs de Symfony
Bonjour

Dans un formulaire je veux incorporer les champs d'un formulaire dans un  autre. En fait, j'ai 2 entités Souscripteur.php et Enfant.php et 1 Souscripteur peut avoir 0, 1 ou plusieurs enfants. J'ai déjà fait les liens entre les entités. 
Mon problème est de pouvoir les champs enfants dans le formulaire SouscripteurType.php. J'ai un champs "Nombre d'enfants dans Souscripteur.php et j'aimerais qu'en fonction du nombre d'enfants on puisse ajouter les champs enfants pour les remplir.

Voici mes codes, je cherche d'abord ce qu'il faut mettre au niveau du controller, je pense pouvoir me débrouiller ensuite au niveau des vues, merci pour votre aide :

<?php

namespace App\Controller;

use App\Entity\Souscripteur;
use App\Entity\Enfant;
use App\Form\SouscripteurType;
use App\Repository\SouscripteurRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * @Route("/souscripteur")
 */
class SouscripteurController extends AbstractControllera
{
    
    /**
     * @Route("/new", name="souscripteur_new", methods={"GET","POST"})
     */
    public function new(Request $request): Response
    {
        $souscripteur = new Souscripteur();

        $enfant = new Enfant();
        $souscripteur->addEnfant($enfant);

        $form = $this->createForm(SouscripteurType::class, $souscripteur);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($souscripteur);
            $entityManager->flush();

            return $this->redirectToRoute('souscripteur_index');
        }

        return $this->render('souscripteur/new.html.twig', [
            'souscripteur' => $souscripteur,
            'form' => $form->createView(),
        ]);
    }

    
}



Mais j'ai cette erreur:
Could not load type "App\Entity\Enfant": class does not implement "Symfony\Component\Form\FormTypeInterface".


MINKOUE OBAME Anouchka

unread,
Feb 26, 2020, 5:54:17 PM2/26/20
to Association Francophone des Utilisateurs de Symfony
<?php

namespace App\Form;

use App\Entity\Souscripteur;
use App\Entity\Enfant;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;

class SouscripteurType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('civilite', ChoiceType::class, [
                'choices'  => [
                    'Madame' => 'madame',
                    'Mademoiselle' => 'mademoiselle',
                    'Monsieur' => 'monsieur',
                ],
            ])
            ->add('nom', TextType::class)
            ->add('prenom')
            ->add('nom_jeune_fille')
            ->add('date_naissance')
            ->add('pays_naissance')
            ->add('ville_naissance')
            ->add('pays_residence')
            ->add('ville_residence')
            ->add('profession')
            ->add('adresse')
            ->add('code_postal')
            ->add('ville')
            ->add('telephone')
            ->add('tel_domicile')
            ->add('situation_familiale', ChoiceType::class, [
                'choices'  => [
                    'Marié' => 'marie',
                    'Pacsé(e)' => 'pasce',
                    'Concubin(e)' => 'concubin',
                    'Célibataire' => 'celibataire',
                    'Divorcé(e)' => 'divorce',
                    'Veuf(ve)' => 'veuf',
                ],
            ])
            ->add('nombre_enfants', ChoiceType::class, [
                'choices'  => [
                    '0' => '0',
                    '1' => '1',
                    '2' => '2',
                    '3' => '3',
                    '4' => '4',
                    '5' => '5',
                    '6' => '6',
                    '8' => '8',
                    '9' => '9',
                    '10' => '10',
                ],
            ])
            ->add('enfants', CollectionType::class, [
                'entry_type' => Enfant::class,
                ])
            ->add('conjoint')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Souscripteur::class,
        ]);
    }
}

Béchir Ba

unread,
Feb 27, 2020, 4:59:51 PM2/27/20
to Association Francophone des Utilisateurs de Symfony
Bonjour,
C'est ici l'erreur:
->add('enfants', CollectionType::class, [
     'entry_type' => Enfant::class,
]) 

Alors là ya deux solutions:
Si tu veux créer une collection, tu dois créer un type pour enfant (EnfantType par exemple) et ensuite :
->add('enfants', CollectionType::class, [
     'entry_type' => EnfantType::class,
]) 


Si tu veux que l'utilisateur puisse faire un choix sur une liste déroulante c'est EntityType qu'il te faut:
->add('enfants', EntityType::class, [
     'class' => Enfant::class,
     'choice_label' => '' // un attribute à afficher sur la classe Enfant
]) 


MINKOUE OBAME Anouchka

unread,
Feb 29, 2020, 3:55:51 AM2/29/20
to Association Francophone des Utilisateurs de Symfony
Bonjour
Merci j'ai mis ceci 
->add('enfants', CollectionType::class, [
     'entry_type' => EnfantType::class,
]) 

mais j'ai cette erreur que je ne sais quoi faire:
Entity of type "App\Entity\Souscripteur" passed to the choice field must be managed. Maybe you forget to persist it in the entity manager?

Le mercredi 26 février 2020 23:44:21 UTC+1, MINKOUE OBAME Anouchka a écrit :
Reply all
Reply to author
Forward
0 new messages