Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formulaires dynamiques symfony et javaScript

symfony et javaScript

Sujet résolu
    30 mars 2020 à 15:00:47

    Bonjour, 

    Je cherche un peu d'aide car je bloque à l’exécution d'un script.

    Le script fonctionne bien, à priori, mais au moment de "submit" le formulaire, des champs sont renvoyés" null"  alors que quand je contrôle la  requête tout semble pourtant être correcte. 

    Voilà, je dispose de plusieurs entités reliées entre elles ainsi :

    Entité 1<--->n Subentite 1<--->Personne<1--->n Booking n<--->1 Chambre.

    Depuis une chambre je génère le formulaire qui dynamiquement m'affiche champs par champ dans un select les entités, puis les sous entités et enfin les personnes qui y sont rattachées. Je peux également sélectionner les dates d'arrivée et de départ. 

    L'erreur retournée est que mon champ "date de fin" et "personne" sont retournée à null... alors que quand j'inspecte le symfony profiler il m'affiche bien l'ensemble des données mais au moment de les pousser, plus rien sur ces deux champs là ....

    Quelqu'un aurait il une idée d'où peux venir l'erreur ?

    Voici le code :

    le Formulaire :

    <?php
    
    namespace App\Form;
    
    use App\Entity\Entite;
    use App\Entity\Booking;
    use App\Entity\Personne;
    use App\Entity\SubEntite;
    
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormInterface;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\DateType;
    use Symfony\Component\Form\Extension\Core\Type\CollectionType;
    
    class AffecterType extends AbstractType
    {
    
                /**
         * Permet d'obtenir la configuration de base du formulaire
         *
         * @param string $label
         * @param string $placeholder
         * @param array $options
         * @return array
         */
    
        private function getConfiguration($label, $placeholder, $options=[]) {
            
            return array_merge( [
            'label' => false,
            'required'    => false,
            'auto_initialize' => false,
            'attr'  => [
                'placeholder' => $placeholder
                   ]
            ], $options);
       }
    
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
    
            ->add('startDate', DateType::class, $this->getConfiguration("Date arrivée",
            "La date à laquelle vous attribuez la chambre", ["widget"=>"single_text"]))
             
            ->add('endDate', DateType::class, $this->getConfiguration("Date départ",
            "La date à laquelle vous liberez la chambre",["widget"=>"single_text"]))
              
               
            ->add('entite', EntityType::class, [
                'class'       =>'App\Entity\Entite',
                'placeholder' =>'sélectionnez votre entite ',
                'label'       => false,
                'mapped'      => false,
                'required'    => false
    
    
        ]);
               $builder->get('entite')->addEventListener(
                    FormEvents::POST_SUBMIT,
                    function (FormEvent $event) {
                        $form = $event->getForm();
                        $this->addSubentiteField($form->getParent(), $form->getData());
                     
                    }
                );
                        $builder->addEventListener(
                            FormEvents::POST_SET_DATA,
                            function (FormEvent $event) {
                            $data = $event->getData();
                                        /* @var $personne Personne */
                                        $personne = $data->getPersonne();
                                        $form = $event->getForm();
    
                                        if ($personne) {
                                            $personne = $personne->getPersonne();
                                            $subentite = $personne->getSubEntite();
                                            $entite = $subentite->getEntite();
                                             
                                            $this->addEntiteField($form, $entite);
                                            $this->addSubentiteField($form, $subentite);
                                            $this->addPersonneField($form, $personne);
                                            $form->get('entite')->setData($entite);
                                            $form->get('subentite')->setData($subentite);
                                            $form->get('personne')->setData($personne);
                                            }
                                            else{
                                                 
                                                $this->addSubentiteField($form, null);
                                                $this->addPersonneField($form,null);
     
                                                }  
     
                                                    });
                                                }
    
        /**
            * Rajoute un champs sous-entite au formulaire
            *
            * @param FormInterface $form
            * @param Entite $entite
            *
            */
            private function addSubentiteField(FormInterface $form, ?Entite $entite) {
    
                $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
                    'subentite',
                    EntityType::class,
                    null,
                        [
                        'class'       =>'App\Entity\SubEntite',
                        'placeholder' => $entite ?'sélectionnez votre compagnie' : 'Sélectionnez votre entite',
                        'label' => false,
                        'mapped'      => false,
                        'required'    => false,
                        'auto_initialize' => false,
                        'choices'     => $entite ? $entite->getSubentite() : []
                        ]
                    );
    
                        $builder->addEventListener(
                            FormEvents::POST_SUBMIT,
                            function (FormEvent $event) {
                            $form = $event->getForm();
                            $this->addPersonneField($form->getParent(), $form->getData());
                            
                            }
                        );
    
                $form->add($builder->getForm());
    
                }
         
        /**
        * Ajouter un champ Personne au formulaire
        *
        * @param FormInterface $form
        * @param SubEntite|null $subentite
        *
        */
        private function addPersonneField(FormInterface $form, ?SubEntite $subentite)
        {
        $form->add('personne',
        EntityType::class,
    
        [
        'class'           => 'App\Entity\Personne',
        'placeholder'     => $subentite ? 'Sélectionnez votre personne' : 'Sélectionnez avant votre compagnie',
        'label'           => false,
        'mapped'          => false,
        'required'        => false,
        'auto_initialize' => false,
        'choices'         => $subentite ? $subentite->getPersonne() : []
        ]
        );
    }   
    
    
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => Booking::class,
            ]);
        }
    
           /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
            return 'app_booking';
           
        }
    }
    

    le controleur :

      /**
         *  Affecter une personne dans une chambre
         * @Route("/affecter/{nom}", name="affecter_chambre")
         * 
         * 
         *  @return Response
         */
        public function affecter(Chambre $chambre, Request $request, ObjectManager $manager)
        {
            $booking= new Booking();
            
            $form =$this->createForm(AffecterType::Class, $booking);
            $form->handleRequest($request);
                     
            if ($form->isSubmitted() && $form->isValid())
            {       
                                  
                $booking->setChambre($chambre);
                
                
                $manager->persist($booking);     
                $manager->flush();
                
                $this->addFlash(
                   'success',
                    "Le <strong>{$personne->getFullName()}</strong> est logé!"
                );
    
                return $this->redirectToRoute('chambre_show', [
                    'id' => $chambre->getId()
                ]);
            }
            
    
            return $this->render('booking/affecter.html.twig', [
                'booking'=>$booking,
                'chambre'=>$chambre, 
                         
                'form'=>$form->createView()            
            ]);
        }
    

    La vue :

    {% extends 'base.html.twig' %}
    
    {% block title %} Affecter {% endblock %}
    
    {% block body %}
    
    
    <div class ="container">
        <h2> Affectez une personne dans la chambre N°: {{chambre.nom}}</h2>
    
                <div class="alert alert-light mt-3">
                    
                    {{form_start(form, {'attr': {'novalidate': 'novalidate'}} )}} 
                    
                    <h4 mb-12> Sélectionnez une chambre </h4>
                        
                        <div class="form-row ">
                        {% if form.entite is defined %}
        
    
                            <div class ="col">
                                    {{form_row(form.entite)}} {#  <select id="app_booking_entite" ... #} 
                
                            </div>
                            {% endif %}
    
                             {% if form.subentite is defined %}
                            <div class ="col">
                                    {{form_row(form.subentite)}} {#  <select id="app_booking_subentite" ... #}
                             {% endif %}
                            </div>
                            
                        </div>
    
                        <div class="form-row ">
                       
                            <div class ="col">
                                    {{form_row(form.personne)}} {#  ... <select id="app_booking_personne" ... #}
                            
                            </div>
    
                            
                        </div>
    
                  
            </div>    
               
       
        <h4 mb-12> saisissez les dates de réservation</h4>
             
              <div class="row">
                  <div class ="col">
                        {{form_row(form.startDate)}} {# <select id="app_booking_startDate" ... #} 
     
                  </div>
                  <div class ="col">
                          {{form_row(form.endDate)}} {# <select id="app_booking_endDate" ... #} 
     
                  </div>
    
                  
              </div>
        
            <div class="row">
                  <div class ="col align-left">
                    
                 </div>
                 <div class ="col align-left">
                    
                 </div>
                 <div class ="col align-left">
                    
                 </div>
                 <div class ="col align-left">
                    
                 </div>
                 <div class ="col align-left">
                    
                 </div>
                 <div class ="col align-left">
                    <button type="submit" class="btn btn-success">Affectez</button>
                 </div>
            </div>
    
    
        {{form_end(form)}}    
       
        </div>
    
    </div>
    
    {% endblock %}
    



    le script permettant de sélectionner dynamiquement les champs :

    $(document).on('change', '#app_booking_entite, #app_booking_subentite, #app_booking_personne,#app_booking_emprise, #app_booking_batiment, #app_booking_etage ,#app_booking_chambre,#app_booking_startDate, #app_booking_endDate', function (){
         
        let $field = $(this)
        //on ajoute le csrf
        let $token = $ ('#app_booking_token');
        
        
    
        let $empriseField = $('#app_booking_emprise');
        let $batimentField = $('#app_booking_batiment');
        let $etageField = $('#app_booking_etage');
      
        let $entiteField = $('#app_booking_entite');
        let $subentiteField = $('#app_booking_subentite');
        let $personneField = $('#app_booking_personne');
     
        let $startDateField = $('#app_booking_startDate');
        let $endDateField = $('#app_booking_endDate');
        
        let $form = $field.closest('form');
        let target = '#' +$field.attr('id').replace('endDate', 'endDate').replace('startDate', 'endDate').replace('etage', 'chambre').replace('batiment','etage').replace('emprise','batiment').replace('subentite','personne').replace('entite','subentite')
        
        
        let data = {}
        data[$token.attr('name')] = $token.val() 
    
        data[$empriseField.attr('name')] = $empriseField.val()
        data[$batimentField.attr('name')] = $batimentField.val()   
        data[$etageField.attr('name')] = $etageField.val() 
    
        data[$entiteField.attr('name')] = $entiteField.val()
        data[$subentiteField.attr('name')] = $subentiteField.val() 
        data[$personneField.attr('name')] = $personneField.val() 
    
        data[$startDateField.attr('name')] = $startDateField.val()   
        data[$endDateField.attr('name')] = $endDateField.val()  
        
        data[$field.attr('name')] = $field.val()
          
        
        
        
    
        alert($field.val());
        $.post($form.attr('action'), data).then(function (data) {
            
            // On récupère le nouveau <select>
            let $input = $(data).find(target)
            
            // On remplace notre <select> actuel
            $(target).replaceWith($input)
            
          console.log(target);
         
         
           })
       })

    J'ai laissé un alert($field.val());

    pour m'assurer que les éléments étaient bien envoyés les uns derrière les autres au cas ou mais rien n'y fait. 

    Le profiler juste avant de soumettre la requête :




    Et la superbe erreur :+(

    Voilà si quelqu'un aurait la gentillesse de m'aider car je pense que l'erreur est provoquée par le script.

    Cordialement, 

    Ian

    -
    Edité par Ian41 31 mars 2020 à 13:08:48

    • Partager sur Facebook
    • Partager sur Twitter
      30 mars 2020 à 15:18:01

      Bonjour.

      Corriges l'indentation du premier bloc de code, car il devient rapidement illisible.

      • Partager sur Facebook
      • Partager sur Twitter

      Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

        30 mars 2020 à 15:55:17

        No problemo c'est fait

        Thx

        • Partager sur Facebook
        • Partager sur Twitter
          30 mars 2020 à 21:06:26

          Bonjour apparament tu as essayé de flusher une entité son respecter sa constraint NOT NULL envers ça propriété 'end_date' , 

          la donnée et bien envoyé si j'en crois le profiler ^.^ , mais ton formulaire n'a pas trouvé la propriété je te soupçonne d'avoir fait une faute de frappe dans le nom de ta propriété dans ton entité Booking tu peut tenté d'afficher l'état de ta propriété juste avant le flush qui plante voir les valeurs de ces propriété ( si tu as installé le component var_dumper de symfony tu auras le log dans la toolbar de symfony , si tu as installé synfony en flex tu peut installé le var dumper via l'aliase de nom dump ):

          /**
             *  Affecter une personne dans une chambre
             * @Route("/affecter/{nom}", name="affecter_chambre")
             *
             *
             *  @return Response
             */
            public function affecter(Chambre $chambre, Request $request, ObjectManager $manager)
            {
                $booking= new Booking();
                 
                $form =$this->createForm(AffecterType::Class, $booking);
                $form->handleRequest($request);
                          
                if ($form->isSubmitted() && $form->isValid())
                {      
                                       
                    $booking->setChambre($chambre);
             
                    // affiche l'état de l'entité avant de le flushé
                    dump( $booking ) ;
                  
                     
                    $manager->persist($booking);    
                    $manager->flush();
                     
                    $this->addFlash(
                       'success',
                        "Le <strong>{$personne->getFullName()}</strong> est logé!"
                    );
           
                    return $this->redirectToRoute('chambre_show', [
                        'id' => $chambre->getId()
                    ]);
                }
                 
           
                return $this->render('booking/affecter.html.twig', [
                    'booking'=>$booking,
                    'chambre'=>$chambre,
                              
                    'form'=>$form->createView()           
                ]);
            }

          est ce que tu peut nous montré le contenu du ficher Booking.php

          voir si les noms de propriété de l'entitiés correspondent avec les noms de champs fournit par le formulaire qui construit l'entité.

          • Partager sur Facebook
          • Partager sur Twitter

          suggestion de présentation.

            31 mars 2020 à 10:47:36

            Bonjour, 

            Et avant toute chose merci de ton aide et du temps consacré. 

            Voici l'état du dump(); et effectivement rien ne passe hormis la startDate et l'id de la chambre ....:-°

            alors qu'effectivement le script renvoi bien les infos c'est pour ça que je ne comprends pas d'ou vient l'erreur...

            Je mets les entités chambre, booking et personne au cas ou tu verrais quelque chose 

            Booking : 

            <?php
            
            namespace App\Entity;
            
            
            use Cocur\Slugify\Slugify;
            use Doctrine\ORM\Mapping as ORM;
            use Doctrine\Common\Collections\Collection;
            use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
            use Doctrine\Common\Collections\ArrayCollection;
            use Symfony\Component\Validator\Constraints as Assert;
            
            /**
             * @ORM\Entity(repositoryClass="App\Repository\BookingRepository")
             * @ORM\HasLifecycleCallbacks
             */
            class Booking
            {
                /**
                 * @ORM\Id()
                 * @ORM\GeneratedValue()
                 * @ORM\Column(type="integer")
                 */
                private $id;
            
                /**
                 * @ORM\ManyToOne(targetEntity="App\Entity\Chambre", inversedBy="bookings")
                 * @ORM\JoinColumn(nullable=false)
                 * 
                 */
                private $chambre;
            
                /**
                 * @ORM\Column(type="datetime")
                 * @ORM\JoinColumn(nullable=false)
                 * @Assert\Date(message= "la date doit être au bon format")
                 */
                private $startDate;
            
                /**
                 * @ORM\Column(type="datetime")
                 * @ORM\JoinColumn(nullable=false)
                 * @Assert\Date(message= "la date doit être au bon format")
                 */
                private $endDate;
            
                /**
                 * @ORM\Column(type="datetime")
                 */
                private $createdAt;
            
                /**
                 * @ORM\ManyToOne(targetEntity="App\Entity\Personne", inversedBy="booking")
                 */
                private $personne;
            
              
                
                public function getChambre(): ?Chambre
                {
                    return $this->chambre;
                }
            
                public function setChambre(?Chambre $chambre): self
                {
                    $this->chambre = $chambre;
            
                    return $this;
                }
            
                public function getStartDate(): ?\DateTimeInterface
                {
                    return $this->startDate;
                }
            
                public function setStartDate($startDate): self
                {
                    $this->startDate = $startDate;
            
                    return $this;
                }
            
                public function getEndDate(): ?\DateTimeInterface
                {
                    return $this->endDate;
                }
            
                public function setEndDate($endDate): self
                {
                    $this->endDate = $endDate;
            
                    return $this;
                }
            
                public function getCreatedAt(): ?\DateTimeInterface
                {
                    return $this->createdAt;
                }
            
                public function setCreatedAt(\DateTimeInterface $createdAt): self
                {
                    $this->createdAt = $createdAt;
            
                    return $this;
                }
            
                public function __toString()
                {
                    
                    return $this->chambre;
                    return $this->id;
                    
                }
            
               
                /**
                 * Gets triggered only on insert
                 * @ORM\PrePersist
                 */
                public function onPrePersist()
                {
                    $this->setCreatedAt = new \DateTime("now");
                    if ($this->getCreatedAt() === null) {
                        $this->setCreatedAt(new \DateTime('now'));
                    }
                }
            
                public function getPersonne(): ?Personne
                {
                    return $this->personne;
                }
            
                public function setPersonne(?Personne $personne): self
                {
                    $this->personne = $personne;
            
                    return $this;
                }
            
                
                    
            }
            

             Chambre :

            <?php
            
            namespace App\Entity;
            
            
            use Cocur\Slugify\Slugify;
            use Doctrine\ORM\Mapping as ORM;
            use Doctrine\Common\Collections\Collection;
            use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
            use Doctrine\Common\Collections\ArrayCollection;
            use Symfony\Component\Validator\Constraints as Assert;
            
            /**
             * @ORM\Entity(repositoryClass="App\Repository\BookingRepository")
             * @ORM\HasLifecycleCallbacks
             */
            class Booking
            {
                /**
                 * @ORM\Id()
                 * @ORM\GeneratedValue()
                 * @ORM\Column(type="integer")
                 */
                private $id;
            
                /**
                 * @ORM\ManyToOne(targetEntity="App\Entity\Chambre", inversedBy="bookings")
                 * @ORM\JoinColumn(nullable=false)
                 * 
                 */
                private $chambre;
            
                /**
                 * @ORM\Column(type="datetime")
                 * @ORM\JoinColumn(nullable=false)
                 * @Assert\Date(message= "la date doit être au bon format")
                 */
                private $startDate;
            
                /**
                 * @ORM\Column(type="datetime")
                 * @ORM\JoinColumn(nullable=false)
                 * @Assert\Date(message= "la date doit être au bon format")
                 */
                private $endDate;
            
                /**
                 * @ORM\Column(type="datetime")
                 */
                private $createdAt;
            
                /**
                 * @ORM\ManyToOne(targetEntity="App\Entity\Personne", inversedBy="booking")
                 */
                private $personne;
            
              
                
                public function getChambre(): ?Chambre
                {
                    return $this->chambre;
                }
            
                public function setChambre(?Chambre $chambre): self
                {
                    $this->chambre = $chambre;
            
                    return $this;
                }
            
                public function getStartDate(): ?\DateTimeInterface
                {
                    return $this->startDate;
                }
            
                public function setStartDate($startDate): self
                {
                    $this->startDate = $startDate;
            
                    return $this;
                }
            
                public function getEndDate(): ?\DateTimeInterface
                {
                    return $this->endDate;
                }
            
                public function setEndDate($endDate): self
                {
                    $this->endDate = $endDate;
            
                    return $this;
                }
            
                public function getCreatedAt(): ?\DateTimeInterface
                {
                    return $this->createdAt;
                }
            
                public function setCreatedAt(\DateTimeInterface $createdAt): self
                {
                    $this->createdAt = $createdAt;
            
                    return $this;
                }
            
                public function __toString()
                {
                    
                    return $this->chambre;
                    return $this->id;
                    
                }
            
               
                /**
                 * Gets triggered only on insert
                 * @ORM\PrePersist
                 */
                public function onPrePersist()
                {
                    $this->setCreatedAt = new \DateTime("now");
                    if ($this->getCreatedAt() === null) {
                        $this->setCreatedAt(new \DateTime('now'));
                    }
                }
            
                public function getPersonne(): ?Personne
                {
                    return $this->personne;
                }
            
                public function setPersonne(?Personne $personne): self
                {
                    $this->personne = $personne;
            
                    return $this;
                }
            
                
                    
            }
            

            Personne :

            <?php
            
            namespace App\Entity;
            
            use App\Entity\Entite;
            use Doctrine\Common\Collections\ArrayCollection;
            use Doctrine\Common\Collections\Collection;
            use Doctrine\ORM\Mapping as ORM;
            use Doctrine\ORM\Mapping\JoinColumn;
            
            /**
             * @ORM\Entity(repositoryClass="App\Repository\PersonneRepository")
             */
            class Personne
            {
                /**
                 * @ORM\Id()
                 * @ORM\GeneratedValue()
                 * @ORM\Column(type="integer")
                 */
                private $id;
            
                /**
                 * @ORM\Column(type="string", length=255, nullable=true)
                 */
                private $nomfamille;
            
                /**
                 * @ORM\Column(type="string", length=255, nullable=true)
                 */
                private $prenom;
            
                /**
                 * @ORM\Column(type="string", length=255, nullable=true)
                 */
                private $grade;
            
                /**
                 * @ORM\Column(type="string", length=255, nullable=true)
                 */
                private $genre;
            
                /**
                 * @ORM\Column(type="string", length=255, nullable=true)
                 */
                private $matricule;
            
             
                /**
                 * @ORM\ManyToOne(targetEntity="App\Entity\SubEntite", inversedBy="personne")
                 * 
                 */
                private $subEntite;
            
                /**
                 * @ORM\OneToMany(targetEntity="App\Entity\Booking", mappedBy="personne")
                 */
                private $booking;
            
                public function __construct()
                {
                    $this->booking = new ArrayCollection();
                }
            
              
               
            
            
                public function getFullName()
                {
                    return "{$this->grade} {$this->nomfamille} {$this->prenom}";
                }
            
            
                public function getId(): ?int
                {
                    return $this->id;
                }
            
                public function getNomfamille(): ?string
                {
                    return $this->nomfamille;
                }
            
                public function setNomfamille(?string $nomfamille): self
                {
                    $this->nomfamille = $nomfamille;
            
                    return $this;
                }
            
                public function getPrenom(): ?string
                {
                    return $this->prenom;
                }
            
                public function setPrenom(?string $prenom): self
                {
                    $this->prenom = $prenom;
            
                    return $this;
                }
            
                public function getGrade(): ?string
                {
                    return $this->grade;
                }
            
                public function setGrade(?string $grade): self
                {
                    $this->grade = $grade;
            
                    return $this;
                }
            
                public function getGenre(): ?string
                {
                    return $this->genre;
                }
            
                public function setGenre(?string $genre): self
                {
                    $this->genre = $genre;
            
                    return $this;
                }
            
                public function getMatricule(): ?string
                {
                    return $this->matricule;
                }
            
                public function setMatricule(?string $matricule): self
                {
                    $this->matricule = $matricule;
            
                    return $this;
                }
            
            
                public function getSubEntite(): ?SubEntite
                {
                    return $this->subEntite;
                }
            
                public function setSubEntite(?SubEntite $subEntite): self
                {
                    $this->subEntite = $subEntite;
            
                    return $this;
                }
            
            
                public function __toString()
                {
                    
                    return $this->nomfamille;
                }
            
                /**
                 * @return Collection|Booking[]
                 */
                public function getBooking(): Collection
                {
                    return $this->booking;
                }
            
                public function addBooking(Booking $booking): self
                {
                    if (!$this->booking->contains($booking)) {
                        $this->booking[] = $booking;
                        $booking->setPersonne($this);
                    }
            
                    return $this;
                }
            
                public function removeBooking(Booking $booking): self
                {
                    if ($this->booking->contains($booking)) {
                        $this->booking->removeElement($booking);
                        // set the owning side to null (unless already changed)
                        if ($booking->getPersonne() === $this) {
                            $booking->setPersonne(null);
                        }
                    }
            
                    return $this;
                }
            
            
            
            }
            

            Voilà si tu as une idée je suis preneur.

            Cordialement, 

            Ian


            • Partager sur Facebook
            • Partager sur Twitter
              31 mars 2020 à 12:17:07

              Bonjour effectivement c'est bizzare 0.o ...

              pour régler le problème ( sans vraiment trouvé d'où il vient  ) tu peut mannuelement appéler les setters avant de flusher ton entité en prenant les valeurs dans ton form entity:

              /**
                 *  Affecter une personne dans une chambre
                 * @Route("/affecter/{nom}", name="affecter_chambre")
                 *
                 *
                 *  @return Response
                 */
                public function affecter(Chambre $chambre, Request $request, ObjectManager $manager)
                {
                    $booking= new Booking();
                      
                    $form =$this->createForm(AffecterType::Class, $booking);
                    $form->handleRequest($request);
                               
                    if ($form->isSubmitted() && $form->isValid())
                    {     
                                            
                        $booking->setChambre($chambre);
                  
                        $data = $form->getData() ;
              
                        $booking->setEndDate( $data['endDate'] ) ;
              
                        // .... ect ....
              
                        // affiche l'état de l'entité avant de le flushé
                        dump( $booking ) ;
                       
                          
                        $manager->persist($booking);   
                        $manager->flush();
                          
                        $this->addFlash(
                           'success',
                            "Le <strong>{$personne->getFullName()}</strong> est logé!"
                        );
                
                        return $this->redirectToRoute('chambre_show', [
                            'id' => $chambre->getId()
                        ]);
                    }
                      
                
                    return $this->render('booking/affecter.html.twig', [
                        'booking'=>$booking,
                        'chambre'=>$chambre,
                                   
                        'form'=>$form->createView()          
                    ]);
                }

              je n'ai malheuresement pas plus d'idée pour l'instant la construction de ton formulaire entity et assez complexe je n'ai pas tous compris au niveeau des events , tu as ici la doc page des forms events si ça peut t'aidé .

              comme ton problème et très axés sur Symfony tu peut peut être rajouté "symfony" dans le titre de ton sujet certaine personne maitrisant un peut plus le framework pourrait venir voir en survolant les topics.

              -
              Edité par SamuelGaborieau3 31 mars 2020 à 12:19:29

              • Partager sur Facebook
              • Partager sur Twitter

              suggestion de présentation.

                31 mars 2020 à 13:08:14

                Hello 

                J'ai essayé ta proposition pour appeler manuellement les setter. Voici la réponse :

                Concernant les events du form je ne cherche pas de ce coté là vue que j'arrive à remplir chacun de mes champs. ce qui signifie que symfony écoute correctement et me renvoi les bonnes associations. Si les events ne fonctionnaient pas ils ne me renverraient pas les datas. 

                Je pense que ça coince plutôt du coté du JS cf. ci dessus ( bien que le Symfony Profiler me remonte les datas saisis dans les champs). 

                Il me dit aussi que le token csrf du JS est invalid et de re-soumettre le formulaire. Ça te parle ?

                Je vais suivre ton conseil et ajouter Symfony dans le titre.

                Ian

                • Partager sur Facebook
                • Partager sur Twitter
                  31 mars 2020 à 13:24:11

                  on dirait que $form->getData() ; ta renvoyé l'instance de booking qu'il n'a pas réussit à completé et non les données brut du formulaire ,

                  après que tu est reçut les données côté serveur Javascript ne peut plus interagir avec les données et ton profiler logs des données au format valide en POST pour ta requête , je ne c'est pas plus d'ou ça vient si tu as un peut le temps et que tu as déjà utilisé l' ORM-fixtures tu peut peut être essayé de remplir un jeux de données depuis des fixtures pour voir si ça bloque au niveau de ton entité ou du formulaire comme les fixtures n'utilise pas le formulaire si tu ne peut pas remplir de jeux de données via des fixtures ces que ces ton entité qui bloque , tu as le package fzaninotto/Faker pour construire des jeux de données variées et rapidement , et puis si ça bloque pas dans un premier temps tu pourras au moins continué à développé le reste de ton application avec le jeux de données fictive et revenir débloqué ton formulaire plus tards.

                  Si tu penses  que ça vient du Javascript tu peut dans un premier temps le mettre en commentaires ( ça ne doit pas empécher de remplir le formulaire ) , et de renvoyé le formulaire au moins tu sauras si ça vient du javascript.

                  -
                  Edité par SamuelGaborieau3 31 mars 2020 à 13:27:52

                  • Partager sur Facebook
                  • Partager sur Twitter

                  suggestion de présentation.

                    14 avril 2020 à 14:32:07

                    Pour clore le sujet, j'ai fini par trouver d'ou venait l'erreur. 

                    Voici les fichiers corrigés si cela peut être utile à quelqu'un. 

                    Pour le formulaire l'erreur est que j'avais laissé le dernier champ avec une option Mapped à false. je l'ai simplement supprimée

                    class AffecterType extends AbstractType
                    {
                    
                                /**
                         * Permet d'obtenir la configuration de base du formulaire
                         *
                         * @param string $label
                         * @param string $placeholder
                         * @param array $options
                         * @return array
                         */
                    
                        private function getConfiguration($label, $placeholder, $options=[]) {
                            
                            return array_merge( [
                            'label' => false,
                            'required'    => false,
                            'auto_initialize' => false,
                            'attr'  => [
                                'placeholder' => $placeholder
                                   ]
                            ], $options);
                       }
                    
                    
                        public function buildForm(FormBuilderInterface $builder, array $options)
                        {
                            $builder
                    
                              ->add('startDate', DateType::class, $this->getConfiguration("Date arrivée",
                            "La date à laquelle vous attribuez la chambre", ["widget"=>"single_text"]))
                            
                            ->add('endDate', DateType::class, $this->getConfiguration("Date départ",
                            "La date à laquelle vous liberez la chambre",["widget"=>"single_text"])) 
                              
                               
                            ->add('entite', EntityType::class, [
                                'class'       =>'App\Entity\Entite',
                                'placeholder' =>'sélectionnez votre entite ',
                                'label'       => false,
                                'mapped'      => false,
                                'required'    => false,]);
                    
                    
                        
                            $builder->get('entite')->addEventListener(
                                    FormEvents::POST_SUBMIT,
                                    function (FormEvent $event) {
                                        $form = $event->getForm();
                                        $this->addSubentiteField($form->getParent(), $form->getData());
                                     
                                    }
                                );
                                        $builder->addEventListener(
                                            FormEvents::POST_SET_DATA,
                                            function (FormEvent $event) {
                                            $data = $event->getData();
                                                        /* @var $personne Personne */
                                                        $personne = $data->getPersonne();
                                                        $form = $event->getForm();
                                                        if ($personne) {
                                                            $personne = $personne->getPersonne();
                                                            $subentite = $personne->getSubEntite();
                                                            $entite = $subentite->getEntite();
                                                             
                                                            $this->addEntiteField($form, $entite);
                                                            $this->addSubentiteField($form, $subentite);
                                                            $this->addPersonneField($form, $personne);
                                                            $form->get('entite')->setData($entite);
                                                            $form->get('subentite')->setData($subentite);
                                                           
                                                                    }
                                                                        else{
                                                                
                                                                        $this->addSubentiteField($form, null);
                                                                        $this->addPersonneField($form,null);
                     
                                                                            }  
                                                                        }
                                                                    );
                                                                
                        }
                    
                        /**
                        * Rajoute un champs sous-entite au formulaire
                        *
                        * @param FormInterface $form
                        * @param Entite $entite
                        *
                        */
                        private function addSubentiteField(FormInterface $form, ?Entite $entite) {
                    
                        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
                            'subentite',
                            EntityType::class,
                            null,
                                    [
                                    'class'       =>'App\Entity\SubEntite',
                                    'placeholder' => $entite ?'sélectionnez votre compagnie' : 'Sélectionnez votre entite',
                                    'label' => false,
                                    'mapped'      => false,
                                    'required'    => false,
                                    'auto_initialize' => false,
                                    'choices'     => $entite ? $entite->getSubentite() : []
                                    ]
                            );
                    
                            $builder->addEventListener(
                                FormEvents::POST_SUBMIT,
                                function (FormEvent $event) {
                                $form = $event->getForm();
                                $this->addPersonneField($form->getParent(), $form->getData());
                                
                                }
                            );
                    
                    $form->add($builder->getForm());
                    
                    }
                         
                        /**
                        * Ajouter un champ Personne au formulaire
                        *
                        * @param FormInterface $form
                        * @param SubEntite|null $subentite
                        *
                        */
                        private function addPersonneField(FormInterface $form, ?SubEntite $subentite)
                        {
                        $form->add('personne',
                        EntityType::class,
                    
                        [
                        'class'           => 'App\Entity\Personne',
                        'placeholder'     => $subentite ? 'Sélectionnez votre personne' : 'Sélectionnez avant votre compagnie',
                        'label'           => false,
                        'required'        => false,
                        'auto_initialize' => false,
                        'choices'         => $subentite ? $subentite->getPersonne() : []
                        ]
                        );
                    }   

                    enfin j'ai simplifier le Js.

                    $(document).on('change', '#app_booking_entite, #app_booking_subentite, #app_booking_personne,#app_booking_emprise, #app_booking_batiment, #app_booking_etage ,#app_booking_chambre', function () {
                    
                    
                        let $field = $(this)
                    
                    
                        let $empriseField = $('#app_booking_emprise');
                        let $batimentField = $('#app_booking_batiment');
                        let $etageField = $('#app_booking_etage');
                    
                        let $entiteField = $('#app_booking_entite');
                        let $subentiteField = $('#app_booking_subentite');
                        let $personneField = $('#app_booking_personne');
                    
                    
                        let $form = $field.closest('form');
                        let target = '#' + $field.attr('id').replace('etage', 'chambre').replace('batiment', 'etage').replace('emprise', 'batiment').replace('subentite', 'personne').replace('entite', 'subentite')
                    
                    
                        let data = {}
                    
                    
                        data[$empriseField.attr('name')] = $empriseField.val()
                        data[$batimentField.attr('name')] = $batimentField.val()
                        data[$etageField.attr('name')] = $etageField.val()
                    
                        data[$entiteField.attr('name')] = $entiteField.val()
                        data[$subentiteField.attr('name')] = $subentiteField.val()
                        data[$personneField.attr('name')] = $personneField.val()
                    
                    
                        data[$field.attr('name')] = $field.val()
                    
                    
                    
                    
                    
                    
                        $.post($form.attr('action'), data).then(function (data) {
                    
                            // On récupère le nouveau <select>
                            let $input = $(data).find(target)
                    
                            // On remplace notre <select> actuel
                            $(target).replaceWith($input)
                    
                    
                            console.log(target);
                    
                    
                        })
                    })

                    Bon courage à tous

                    Ian

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Formulaires dynamiques symfony et javaScript

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown