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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 extrêmement actif
    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
    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
    Membre averti
    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
    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 extrêmement actif
    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
    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
    Membre averti
    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
    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 : 2950
Taille : 50,5 Ko
    Puis après sélection du type:
    Nom : Formulaire_1etape.jpg
Affichages : 3078
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
    Membre averti
    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
    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');
        }
    });

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