IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Pré-Remplir un Formulaire


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut Pré-Remplir un Formulaire
    Bonjour,

    Je souhaite pré-remplir un formulaire imbriqué, mais en vain...

    Mon controleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
        /**
         * Creates a new Reservation entity.
         *
         * @Route("/new", name="reservation_new")
         * @Method({"GET", "POST"})
         */
        public function newAction(Request $request)
        {
            $reservation = new Reservation();
     
            if ($request->isMethod('POST')) {
                $em = $this->getDoctrine()->getManager();
                $stage = $em->getRepository('DamiasResaBundle:Stage')->find(1);
                $stage = new Stage();
                $reservation -> setStage($stage);
            }
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($reservation);
                $em->flush();
     
                return $this->redirectToRoute('reservation_show', array('id' => $reservation->getId()));
            }
     
            return $this->render('DamiasResaBundle:reservation/new.html.twig', array(
                'reservation' => $reservation,
                'form' => $form->createView(),
            ));
        }
    Et dans mon formType
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        $form->add(Stage, StageType);
    Dans le profiler, Doctrine récupère bien mon entité, mais dans le form, il n'y a rien!?

    Merci de votre aide

  2. #2
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    il y a beaucoup trop d'incohérence, de confusion, de mélange... dans ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     $reservation = new Reservation();
     
            if ($request->isMethod('POST')) {                 //  si le formulaire a été soumis,  WTF ???? 
                $em = $this->getDoctrine()->getManager();
                $stage = $em->getRepository('DamiasResaBundle:Stage')->find(1);
                $stage = new Stage();
                $reservation -> setStage($stage);
            }
            $form->handleRequest($request);    // dans tous les cas, tu remplis le form avec le contenu de la requete   WTF ????
     
            if ($form->isSubmitted() && $form->isValid()) {     //  là, c'est ok 
                $em = $this->getDoctrine()->getManager();
                $em->persist($reservation);
                $em->flush();
     
                return $this->redirectToRoute('reservation_show', array('id' => $reservation->getId()));
            }
     
            return $this->render('DamiasResaBundle:reservation/new.html.twig', array(             // là, ok; 
                'reservation' => $reservation,
                'form' => $form->createView(),
            ));
        }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Merci dukoid de ta réponse.

    Oui, en effet, tout n'est pas très cohérent, ce bout de code viens de ce que je teste depuis quelques jours...
    Désolé, j'ai manqué de précision dans ce que je veux faire...
    J'ai une entité réservation qui est liée à divers type de résa, d'autres entités (Stage, Stagiaire, Hote....)
    Je souhaite lors d'une nouvelle réservation pouvoir sélectionner le type et en fonction de ce type afficher dans mon formulaire:
    • 1 select qui propose un nouveau modèle ou la liste des modèles existant (non mappé)
    • 1 formulaire correspondant au type choisi, vierge en cas de nouveau type ou pré-rempli en cas de modèle existant. (mappé et correspondant au type)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     $reservation = new Reservation();
     
            if ($request->isMethod('POST')) {                 //  J'utilise Ajax pour renvoyer la valeur d'un champs non mappé. C'est la valeur de ce champs qui devrait définir quelle entité charger. Sauf que n'y arrivant pas, j'ai chercher à remplir en dur ma réservation avec une entité fixe. 
                $em = $this->getDoctrine()->getManager();
                $stage = $em->getRepository('DamiasResaBundle:Stage')->find(1);
                $stage = new Stage();
                $reservation -> setStage($stage);
            }
            $form->handleRequest($request);    // Arf, est ce que ça veut dire que ma propriété Stage est réinitialisée à "vide"?
     
            .....

  4. #4
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    houla,

    déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         if ($request->isMethod('POST')) {   // detecte si formulaire est soumis
    
         if ($request->isXmlHttpRequest()) {   // detecte si c'est une requête AJAX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      $form->handleRequest($request);    // Arf, est ce que ça veut dire que ma propriété Stage est réinitialisée à "vide"?
    
    // si il y a rien dans $request alors il y aura rien dans form, c'est logique !
    fait nous un petit schema/maquette de ton système de formulaire. je ne comprends pas trop avec les modèles, les types ...
    et un schema des relations entre entités

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    J'ai une entité principale: Reservation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    class Reservation
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="type", type="string", length=255)
         */
        private $type;
     
        /**
         * @ORM\OneToOne(targetEntity="Damias\ResaBundle\Entity\Stage", cascade={"persist"}, inversedBy="reservation")
         * @Assert\Type(type="Damias\ResaBundle\Entity\Stage")
         * @Assert\Valid()
         */
        private $stage;
     
        /**
         * @ORM\OneToOne(targetEntity="Damias\ResaBundle\Entity\Stagiaire", cascade={"persist"}, inversedBy="reservation")
         */
        private $stagiaire;
     
        /**
         * @ORM\OneToOne(targetEntity="Damias\ResaBundle\Entity\Hote", cascade={"persist"}, inversedBy="reservation")
         */
        private $hote;
     
        /**
         * @ORM\OneToOne(targetEntity="Damias\ResaBundle\Entity\Camping", cascade={"persist"}, inversedBy="reservation")
         */
        private $camping;
     
        /**
         * @ORM\OneToOne(targetEntity="Damias\ResaBundle\Entity\Periode", cascade={"persist"}, inversedBy="reservation")
         */
        private $periode;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="valide", type="boolean", length=255, nullable=true)
         */
        private $valide;
     
    //.....
     
    }
    Mon formulaire au 1er chargement:
    Nom : Formulaire_debut.jpg
Affichages : 2846
Taille : 50,5 Ko
    Puis après sélection du type:
    Nom : Formulaire_1etape.jpg
Affichages : 2974
Taille : 66,5 Ko

    Je veux pré-remplir mon formulaire (sur l'image, celui de l'entité Stage) si je sélectionne un modèle (un clone d'un stage existant en base de données) depuis le select "Choisir un modèle ou en créer un nouveau" (nom mappé dans mon entité Réservation) que je récupère et rempli avec Ajax après sélection du type du départ...

    Arf, désolé pour la phrase à rallonge...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Je pense que je dois utiliser les Evènement pour fair ça, mais lorsque j'ai essayé, je me suis heurté au soucis que le champs select "Choisir un modèle ou en créer un nouveau" n'existe pas au 1er chargement de ma page...

    Et puis je vois pas comment pré-remplir mon formulaire!? :/

    Mon ReservationType:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    class ReservationType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('type', ChoiceType::class, array(
                    'choices'  => array(
                        'Stage' => 'Stage',
                        'Stagiaire' => 'Stagiaire',
                        'Chambre d\'hôte' => 'Hote',
                        'Gîte' => 'Gite',
                        'Camping Famille' => 'Camping Famille',
                        'Wooffer, Stagiaire' => 'Wooffer, Stagiaire',
                        'Famille, Amis' => 'Famille, Amis',
                    ),
                    'label' => 'Type de réservation',
                    'required'    => true,
                    'placeholder' => 'Choisir un type de réservation '
                ))
                ->add('periode',PeriodeType::class)
                ->add('valide', CheckboxType::class, array(
                    'label'    => 'Réservation Confirmée',
                    'required' => false,
                ))
            ;
     
            $formModifierType = function (FormInterface $form, $type) {
                if ($type == null) {
                    $form
                        ->add('typeChoisi', HiddenType::class, array(
                            'data'  => array(),
                            'mapped' => false,
                        ));
                }
                else {
                    $EntityType='Damias\ResaBundle\Form\\'.$type.'Type';
                    $class='DamiasResaBundle:'.$type;
                    $label=$type.' ';
     
                    $form
                        ->remove('typeChoisi')
                        ->add('typeChoisi', EntityType::class, array(
                            'class' => $class,
                            'choice_label' => 'nom',
                            'label' => $label,
                            'required'    => false,
                            'placeholder' => 'Nouveau '.$type,
                            'mapped' => false
                        ))
                        ->add($type, $EntityType)
                        ;
                }
            };
     
            /*$formModifierTypeChoisi = function (FormInterface $form, $typeChoisi, $type) {
                if ($typeChoisi == 0) {
                    $form
                        ->remove($type, $EntityType)
                        ->add($type, $EntityType)
                        ;
                }
                else {
                    $EntityType='Damias\ResaBundle\Form\\'.$type.'Type';
                    $Repository='Damias\ResaBundle\Repository\\'.$type.'Repository';
                    $class='DamiasResaBundle:'.$type;
                    $label=$type.' ';
     
                    $form
                        ->remove('typeChoisi')
                        ->add('typeChoisi', EntityType::class, array(
                            'class' => $class,
                            'choice_label' => 'nom',
                            'label' => $label,
                            'required'    => false,
                            'placeholder' => 'Nouveau '.$type,
                            'mapped' => false
                        ))
                        ->add($type, new $EntityType, array(
                            'query_builder' => function($Repository) {
                                return $repository->getRepository('DamiasResaBundle:'.$type)->find($typeChoisi);
                            }
                        ));
                }
            };*/
     
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifierType) {
                $reservation = $event->getData();
                //echo 'PRE_SET_DATA => $reservation->getType() = '.$reservation->getType();
                $type = null === $reservation->getType() ? null : $reservation->getType();
                //if ($type != null) {
                    $formModifierType($event->getForm(), $type);
                //}
            });
     
            $builder->get('type')->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifierType) {
                $type = $event->getData();
                $formModifierType($event->getForm()->getParent(), $type);
            });
     
            /*if (null !== $builder->get('typeChoisi')) {
                $builder->get('typeChoisi')->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifierTypeChoisi) {
                    $type = $event->getData();
                    $typeChoisi = $event->getData();
                    $formModifierTypeChoisi($event->getForm()->getParent(), $typeChoisi, $type);
                });
            }*/
        }
     
     
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Damias\ResaBundle\Entity\Reservation'
            ));
        }
    }
    Et mon fichier js:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    var $type = $('#reservation_type');
    var $typeSelectione = $('#reservation_'.$type);
     
    $type.change(function() {
        var $form = $(this).closest('form');
        var data = {};
        if ($type.val()!= ''){
            data[$type.attr('name')] = $type.val();
            $.ajax({
                url : $form.attr('action'),
                type: $form.attr('method'),
                data : data,
                success: function(html) {
                    $('#type_Choisi').replaceWith(
                        $(html).find('#type_Choisi')
                    );
                    $('#type_selectione').replaceWith(
                        $(html).find('#type_selectione')
                    );
     
                    var $typeChoisi = $('#reservation_typeChoisi');        
                    $typeChoisi.change(function() {
                    console.log('type choisi (depuis function) =>'+$typeChoisi.val());
                        var $form = $(this).closest('form');
                        data[$typeChoisi.attr('name')] = $typeChoisi.val();
                        console.log('ok');
                        $.ajax({
                            url : $form.attr('action'),
                            type: $form.attr('method'),
                            data : data,
                            success: function(html) {
                                console.log(html);
                                $('#type_selectione').replaceWith(
                                    $(html).find('#type_selectione')
                                );
                            }
                        });
                    });
                }
            });
            console.log('formulaire '+$type.val()+' chargé');
        }
        else {
            location.reload();
            console.log('Page rechargée');
        }
    });

  7. #7
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    un seul formulaire qui englobe tous ces champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    type de reservation
     
    debut, fin
     
    reservation confirmee
     
    choix_modele
    intitule
    participants
    notes
    organisateurs
    sales
    emplacements
    pension

    ensuite sur le choix_modele tu fais une requete ajax pour récupérer les données et en jQuery tu met à jour la partie modèle.
    (c'est possible d'utiliser les événements comme tu l'as indiqué...)


    pour pre remplir le choix_modele, exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $builder->add('users', EntityType::class, array(
        // query choices from this entity
        'class' => 'AppBundle:User',
     
        // use the User.username property as the visible option string
        'choice_label' => 'username',
     
        // used to render a select box, check boxes or radios
         'multiple' => false,
         'expanded' => false,
    ));

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Arf, le soucis de tout mettre dans un seul formulaire, c'est que j'ai pas les mêmes champs (propriétés) selon le choix du type(entité liée)!
    Mon entité Stage est différente de celle d'un stagiaire...
    Ou alors, il faut qu'en fonction du type, je charge un champ pour chaque propriété de l'entité liée!? Je suis pas sur de bien comprendre?
    Ne peut-on pas remplir les champs de l'entité liée ( $form->add($type, $EntityType) ) avec les valeurs que je récupère de la bdd? Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $form->add($type, $EntityType, array(
        'class'     =>'DamiasResaBundle:'$type,
        'query_builder' => function($typeRepository $repository) use($id_type){
            return $repository  -> get_$type($id_type);
        }

  9. #9
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    déjà faut savoir que tu ne peux pas valider 2 formulaires en même temps. ce n'est pas lié à Symfony mais c'est le HTML, c'est comme ça.

    donc après avoir valider la 1ere partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    --form--
      type de reservation
      debut, fin
      reservation confirmee

    la 2eme partie apparaît avec un formulaire vide comme point de départ donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    choix_modele
     
    --form--
      intitule
      participants
      notes
      organisateurs
      sales
      emplacements
      pension
    tu sélectionnes un modèle, en ajax tu récupères un nouveau form et tu le remplaces par celui existant.



    je connais assez bien Symfony mais je trouve que le seul point faible de ce framework c'est les formulaires, quand on commence à vouloir faire un truc assez complexe comme le tiens avec plusieurs conditions et bien ça donne des boutons. d'autant plus regrettable que sur la doc il ne donne aucun exemple complexe. alors bon....
    Pour ma part, je préfère donc passer par jQuery et ajax, c'est simple et tout aussi efficace....
    à toi de voir...

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Donc faire comme un formulaire en étape...
    Je vais creuser de ce côté.
    Merci de ton aide

  11. #11
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    après, est ce mieux d'avoir tout sur le même écran comme tu l'a presenté ou passer par étape une partie, et une autre partie. tu sépare en 2 donc.
    est ce mieux l'un ou l'autre. à toi de voir car il faut prendre en compte cela... question d'ergonomie

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Bon, j'ai séparé mes formulaires en 2 et j'ai créer des action différente dans mon controler, mais au final, c'est Doctrine qui me tape les doigts! :/

    Unable to guess how to get a Doctrine instance from the request information.
    Mon controleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
        public function newAction(Request $request)
        {
            $reservation = new Reservation();
            $form = $this->createForm('Damias\ResaBundle\Form\ReservationType', $reservation);
     
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $reservation = $form->getData();
                return $this->forward('DamiasResaBundle:reservation:newEtape2', array(
                    'reservation' => $reservation
                ));
            }
     
            return $this->render('DamiasResaBundle:reservation/new.html.twig', array(
                'reservation' => $reservation,
                'form' => $form->createView(),
            ));
        }
     
        /**
         * Creates a new Reservation entity Etape 2.
         *
         * @Route("/new/etape_2", name="reservation_new_etape_2")
         * @Method({"GET", "POST"})
         */
        public function newEtape2Action(Request $request, Reservation $reservation)
        {
            $type = $reservation -> getType();
            /*$form = $this->createForm('Damias\ResaBundle\Form\Reservation2Type', $reservation, array(
                'action' => $this->generateUrl('reservation_new_etape_2'),
                'type' => $type
            ));*/
            $type = $reservation -> getType();
            $EntityType='Damias\ResaBundle\Form\\'.$type.'Type';
            $class='DamiasResaBundle:'.$type;
            $label=$type.' ';
            $form = $this->createFormBuilder($reservation)
                ->setAction($this->generateUrl('reservation_new_final'))
                ->add('typeChoisi', EntityType::class, array(
                    'class' => $class,
                    'choice_label' => 'nom',
                    'label' => $label,
                    'required'    => false,
                    'placeholder' => 'Nouveau '.$type,
                    'mapped' => false
                ))
                ->add($type, $EntityType)
                ->getForm()
                ;
     
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $reservation = $form->getData();
                return $this->forward('DamiasResaBundle:reservation:newfinal', array(
                    'reservation' => $reservation
                    ));
            }
     
            return $this->render('DamiasResaBundle:reservation/new2.html.twig', array(
                'reservation' => $reservation,
                'form' => $form->createView(),
            ));
        }
     
        /**
         * Creates a new Reservation entity Final.
         *
         * @Route("/new/final", name="reservation_new_final")
         * @Method({"GET", "POST"})
         */
        public function newFinalAction(Reservation $reservation)
        {
            $em = $this->getDoctrine()->getManager();
            $em->persist($reservation);
            $em->flush();
     
            return $this->redirectToRoute('reservation_show', array('id' => $reservation->getId()));
        }
    et mes ReservationType
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    class ReservationType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('type', ChoiceType::class, array(
                    'choices'  => array(
                        'Stage' => 'Stage',
                        'Stagiaire' => 'Stagiaire',
                        'Chambre d\'hôte' => 'Hote',
                        'Gîte' => 'Gite',
                        'Camping Famille' => 'Camping Famille',
                        'Wooffer, Stagiaire' => 'Wooffer, Stagiaire',
                        'Famille, Amis' => 'Famille, Amis',
                    ),
                    'label' => 'Type de réservation',
                    'required'    => true,
                    'placeholder' => 'Choisir un type de réservation '
                ))
                ->add('periode',PeriodeType::class)
                ->add('valide', CheckboxType::class, array(
                    'label'    => 'Réservation Confirmée',
                    'required' => false,
                ))
            ;
        }
     
     
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Damias\ResaBundle\Entity\Reservation'
            ));
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    class Reservation2Type extends ReservationType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            parent::buildForm($builder, $options);
            $type = $this -> $options['type'];
            $EntityType='Damias\ResaBundle\Form\\'.$type.'Type';
            $class='DamiasResaBundle:'.$type;
            $label=$type.' ';
            $builder
                ->add('typeChoisi', EntityType::class, array(
                        'class' => $class,
                        'choice_label' => 'nom',
                        'label' => $label,
                        'required'    => false,
                        'placeholder' => 'Nouveau '.$type,
                        'mapped' => false
                    ))
                    ->add($type, $EntityType)
                    ;
     
            $formModifierType = function (FormInterface $form, $type) {
                $EntityType='Damias\ResaBundle\Form\\'.$type.'Type';
                $class='DamiasResaBundle:'.$type;
                $label=$type.' ';
     
                $form
                    ->add('typeChoisi', EntityType::class, array(
                        'class' => $class,
                        'choice_label' => 'nom',
                        'label' => $label,
                        'required'    => false,
                        'placeholder' => 'Nouveau '.$type,
                        'mapped' => false
                    ))
                    ->add($type, $EntityType)
                    ;
            };
     
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifierType) {
                $reservation = $event->getData();
                //echo 'PRE_SET_DATA => $reservation->getType() = '.$reservation->getType();
                $type = null === $reservation->getType() ? null : $reservation->getType();
                //if ($type != null) {
                    $formModifierType($event->getForm(), $type);
                //}
            });
        }
     
     
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Damias\ResaBundle\Entity\Reservation'
            ));
        }
    }

  13. #13
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    c'est que tu as fais une bétise
    regarde la trace de l'erreur et à quel moment de ton code cela déclenche cette erreur...

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    L'anglais étant parfois un vague pour moi, je demande à google....
    Unable to guess how to get a Doctrine instance from the request information. = Impossible de deviner comment obtenir une instance Doctrine de l'information de demande. (Merci Google!)
    Il me dit ne pas savoir quoi faire de mon instance Doctrine? ou il sait pas ou la trouver?

    Si je regarde le profiler, je me retrouve avec 2 formulaires! :/ Arf j'en veux qu'un!!!
    Je vois pourquoi j'en ai 2!
    Si j'essaie ce qui suit, j'ai toujours 2 entités...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    public function newEtape2Action(Request $request, Reservation $reservation)
        {
            $type = $reservation -> getType();
            $EntityType='Damias\ResaBundle\Form\\'.$type.'Type';
            $class='DamiasResaBundle:'.$type;
            $label=$type.' ';
     
            $form = $this->createForm('Damias\ResaBundle\Form\Reservation2Type', $reservation, array(
                'action' => $this->generateUrl('reservation_new_etape_2'),
                'option' => array(
                    'type' => $type
                    )
            ));
     
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $reservation = $form->getData();
                return $this->forward('DamiasResaBundle:reservation:newfinal', array(
                    'reservation' => $reservation
                    ));
            }
     
            return $this->render('DamiasResaBundle:reservation/new2.html.twig', array(
                'reservation' => $reservation,
                'form' => $form->createView(),
            ));
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            parent::buildForm($builder, $options);
     
            $formModifierType = function (FormInterface $form, $type) {
                $EntityType='Damias\ResaBundle\Form\\'.$type.'Type';
                $class='DamiasResaBundle:'.$type;
                $label=$type.' ';
     
                $form
                    ->add('typeChoisi', EntityType::class, array(
                        'class' => $class,
                        'choice_label' => 'nom',
                        'label' => $label,
                        'required'    => false,
                        'placeholder' => 'Nouveau '.$type,
                        'mapped' => false
                    ))
                    ->add($type, $EntityType)
                    ;
            };
     
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifierType) {
                $reservation = $event->getData();
                $type = null === $reservation->getType() ? null : $reservation->getType();
                $formModifierType($event->getForm(), $type);
            });
        }
     
     
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Damias\ResaBundle\Entity\Reservation'
            ));
        }
    Si je fait un redirectToroute au lieu du forward dans ma 1ère action, j'ai le même problème mais avant d'affiche ma 2ème page...

    GGrrr! Je vais m'arracher les cheveux dehors histoire de pas avoir en prime l'aspi à passer....

  15. #15
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    quand c'est la muerda, que tu ne sais plus quoi faire. il n'y a qu'une solution tu appelles l'agence tous risque...
    bon avec eux il risque de tout casser et c'est pas ce que tu veux alors tu peux essayer la 2eme solution.


    tu y a vas, petit à petit. tu recommences à zéro. formulaire par formulaire et tu vois ce qui se passe....

    au lieu d'essayer de tout faire EN MEME TEMPS et que tu n'y comprends rien....

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Arf! j'espérais quand même avoir une piste pour trouver où est mon erreur!
    Soit elle est toute bête et d'avoir le nez dedans je la vois pas, sois y a truc que j'ai pas compris... Mais merci quand même!

Discussions similaires

  1. [PDF] Remplir un formulaire PDF avec PHP
    Par Orionmel dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 21/10/2013, 10h14
  2. Réponses: 12
    Dernier message: 28/03/2006, 11h54
  3. [C#] remplir un formulaire a partir d'un dataGrid
    Par leycho dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/02/2006, 01h12
  4. remplir un formulaire qui se met dans un champ hidden
    Par cecileb dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 07/09/2005, 16h37
  5. Réponses: 6
    Dernier message: 24/01/2005, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo