Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 4 Formulaire de contact

    4 juin 2019 à 16:17:28

    Bonjour a tous, j'essai de passer un form symfony 2 sous symfony 4, mais j'ai une erreur que je n'arrive pas a resoudre :

    Le jeton CSRF est invalide. Veuillez renvoyer le formulaire.
    Ce formulaire ne doit pas contenir des champs supplémentaires.

    voici mon formulaire :

    class ContactType extends AbstractType {
    
        public function buildForm(FormBuilderInterface $builder, array $options) {
    
            $builder
                ->add('nom', TextType::class, array('required' => true))
                ->add('email', EmailType::class, array('required' => true))
                ->add('objet', TextType::class, array('required' => true))
                ->add('message', TextareaType::class, array('required' => true,
                    'constraints' => array(new NotBlank(),
                        new length(array('min' => 3)))));
    
        }
    }

    voici mon controller (je m'arrete a IsValid() car l'erreur s'affiche ici) :

    public function contact(\Swift_Mailer $mailer, request $request, ListeDatabases $db, $idStructure) {
            $structure = $this->getDoctrine()
                ->getManager($db->getDatabase())
                ->getRepository('App\Entity\PublicEntity\Structure', $db->getDatabase())
                ->find($idStructure);
    
            $contact = new \stdClass();
            $contact->nom = 'nom';
            $contact->email = 'email';
            $contact->objet = 'objet';
            $contact->message = 'message';
            $form = $this->createForm(ContactType::class); /*, $contact,
                [
                    'action' => $this->generateUrl('app_public_contact'),
                    'method' => 'POST',
                ])
                ->add('submit',SubmitType::class);*/
    
            //$request = $this->getRequest();
            if ($request->getMethod() == 'POST') {
                $form->submit($request->request->all());
                if ($form->isValid()) {


    Au niveau de mon template j'ai mis quelque chose de basic : 

    {{ form_start(form) }}
                {{ form_widget(form) }} 
                <input type="submit" class="btn btn-primary" value="Create"/>
    {{ form_end(form) }}




    Je ne sais plus du tout quoi faire j'ai deja tout essayer.. Quelqu'un aurait une idée ? Merci

    • Partager sur Facebook
    • Partager sur Twitter
      4 juin 2019 à 16:33:49

      Bonjour,

      Il faut implémenter le token csrf:

      https://symfony.com/doc/current/security/csrf.html

      • Partager sur Facebook
      • Partager sur Twitter
      "Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain
        4 juin 2019 à 16:34:06

        bonjour,

        Pour ton token il manque le form_rest dans ta vu

        Sinon aux vues de ton action , ça ne risque pas de fonctionner si tu essai de passer ta requête à ta méthode submit, ça ne se fait pas comme ça.

        Les données du form se récupèrent avec la méthode handleRequest() de ton objet formulaire et ton objet Contact se récupère avec la méthode getData() de ton form après avoir récupérer les données du form

        cf la doc (je comprend toujours pas pourquoi personne ne semble la lire)
        • Partager sur Facebook
        • Partager sur Twitter
          9 juin 2019 à 14:53:58

          Bonjour,

          Moi aussi j'ai un petit souci et j'espère que vous pourrez m'aider.

          Voici le contexte:  je crée une application Web avec Symfony 4.5 pour mon plaisir et je voudrai que mon utilisateur puisse envoyer un mail groupé ou non a ses clients. Je souhaite utiliser swiftmailer. La configuration du bundle est OK car via la console je recois les mails, mais pas avec mon formulaire.

          probléme : Envoyer des mails groupé ou non via mon formulaire.

          Pistes possibles : quand je récupére le destinataire du mailje crois que je ne récupére que son nom, prenom.

          voici le code de mon controller:

          <?php
          
          namespace App\Controller;
          
          use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
          use Symfony\Component\Routing\Annotation\Route;
          use App\Entity\Email;
          use App\Form\ClientType;
          use Symfony\Component\HttpFoundation\Request;
          use Symfony\Component\HttpFoundation\Response;
          use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
          use Symfony\Component\Form\FormTypeInterface;
          use App\Form\EmailType;
          
          class MailerController extends AbstractController
          {
              /**
               * @Route("/mailer", name="mailer")
               */
              public function index(Request $request, \Swift_Mailer $mailer): Response
              {
                $emailFor = new Email();
                $form = $this->createForm(EmailType::class, $emailFor);
                $form->handleRequest($request);
          
                if ($form->isSubmitted() && $form->isValid()) {
                  $emailFor->setDateEmission(new \DateTime('now'));
                  $sujet = $request->request->get('sujet');
                  $emetteur = $request->request->get('emetteur');
                  $destinataire = $request->request->get('destinataire');
                  $corps = $request->request->get('corps');
                  $message = (new \Swift_Message($sujet))
                    ->setFrom($emetteur)
                    ->setTo($destinataire)
                    ->setBody($corps,
                        'text/html'
                    );
          
                $mailer->send($message);
              }
          
                return $this->render('mailer/index.html.twig', [
                    'email' => $emailFor,
                    'form' => $form->createView(),
                ]);
              }
          }
          

          voici maintenant celui de mon entité client

          <?php
          
          namespace App\Entity;
          
          use Doctrine\Common\Collections\ArrayCollection;
          use Doctrine\Common\Collections\Collection;
          use Symfony\Component\Form\FormTypeInterface;
          use App\Form\ClientType;
          use Doctrine\ORM\Mapping as ORM;
          
          /**
           * @ORM\Entity(repositoryClass="App\Repository\ClientRepository")
           */
          class Client
          {
              /**
               * @ORM\Id()
               * @ORM\GeneratedValue()
               * @ORM\Column(type="integer")
               */
              private $id;
          
              /**
               * @ORM\Column(type="string", length=255)
               */
              private $nom;
          
              /**
               * @ORM\Column(type="string", length=255)
               */
              private $prenom;
          
              /**
               * @ORM\Column(type="datetime", nullable=true)
               */
              private $dateNaissance;
          
              /**
               * @ORM\Column(type="string", length=255, nullable=true)
               */
              private $adresse;
          
              /**
               * @ORM\Column(type="string", length=255, nullable=true)
               */
              private $email;
          
              /**
               * @ORM\Column(type="string", length=255)
               */
              private $telephone;
          
              /**
               * @ORM\OneToMany(targetEntity="App\Entity\Vehicule", mappedBy="proprietaire")
               */
              private $vehicules;
          
              /**
               * @ORM\Column(type="datetime")
               */
              private $dateAjout;
          
              /**
               * @ORM\ManyToOne(targetEntity="App\Entity\Email", inversedBy="destinataire")
               */
              private $emailSended;
          
              public function __construct()
              {
                  $this->vehicules = new ArrayCollection();
              }
          
              public function getId(): ?int
              {
                  return $this->id;
              }
          
              public function getNom(): ?string
              {
                  return $this->nom;
              }
          
              public function setNom(string $nom): self
              {
                  $this->nom = $nom;
          
                  return $this;
              }
          
              public function getPrenom(): ?string
              {
                  return $this->prenom;
              }
          
              public function setPrenom(string $prenom): self
              {
                  $this->prenom = $prenom;
          
                  return $this;
              }
          
              public function getDateNaissance(): ?\DateTimeInterface
              {
                  return $this->dateNaissance;
              }
          
              public function setDateNaissance(?\DateTimeInterface $dateNaissance): self
              {
                  $this->dateNaissance = $dateNaissance;
          
                  return $this;
              }
          
              public function getAdresse(): ?string
              {
                  return $this->adresse;
              }
          
              public function setAdresse(?string $adresse): self
              {
                  $this->adresse = $adresse;
          
                  return $this;
              }
          
              public function getEmail(): ?string
              {
                  return $this->email;
              }
          
              public function setEmail(?string $email): self
              {
                  $this->email = $email;
          
                  return $this;
              }
          
              public function getTelephone(): ?string
              {
                  return $this->telephone;
              }
          
              public function setTelephone(string $telephone): self
              {
                  $this->telephone = $telephone;
          
                  return $this;
              }
          
              /**
               * @return Collection|Vehicule[]
               */
              public function getVehicules(): Collection
              {
                  return $this->vehicules;
              }
          
              public function addVehicule(Vehicule $vehicule): self
              {
                  if (!$this->vehicules->contains($vehicule)) {
                      $this->vehicules[] = $vehicule;
                      $vehicule->setProprietaire($this);
                  }
          
                  return $this;
              }
          
              public function removeVehicule(Vehicule $vehicule): self
              {
                  if ($this->vehicules->contains($vehicule)) {
                      $this->vehicules->removeElement($vehicule);
                      // set the owning side to null (unless already changed)
                      if ($vehicule->getProprietaire() === $this) {
                          $vehicule->setProprietaire(null);
                      }
                  }
          
                  return $this;
              }
          
              public function getDateAjout(): ?\DateTimeInterface
              {
                  return $this->dateAjout;
              }
          
              public function setDateAjout(\DateTimeInterface $dateAjout): self
              {
                  $this->dateAjout = $dateAjout;
          
                  return $this;
              }
              public function __toString(){
                return $this->getNom() . " " . $this->getPrenom();
              }
          
              public function getEmailSended(): ?Email
              {
                  return $this->emailSended;
              }
          
              public function setEmailSended(?Email $emailSended): self
              {
                  $this->emailSended = $emailSended;
          
                  return $this;
              }
          }
          



          je vous donne aussi le code de la vu qui gere le formulaire

          {% extends 'base.html.twig' %}
          {%block body%}
          <div class="container">
          {{ form_start(form) }}
          {{ form_end(form) }}
          </div>
          {%endblock%}
          

          et pour finir le code qui genere le formulaire

          <?php
          
          namespace App\Form;
          
          use App\Entity\Email;
          use Symfony\Component\Form\AbstractType;
          use Symfony\Component\Form\FormBuilderInterface;
          use Symfony\Component\OptionsResolver\OptionsResolver;
          use Symfony\Component\Form\Extension\Core\Type\SubmitType;
          
          class EmailType extends AbstractType
          {
              public function buildForm(FormBuilderInterface $builder, array $options)
              {
                  $builder
                      ->add('destinataire')
                      ->add('emetteur')
                      ->add('sujet')
                      ->add('corps')
                      ->add('priorite')
                      ->add('Envoyer', SubmitType::class, [
                          'attr' => ['class' => 'save'],
          ])
                  ;
              }
          
              public function configureOptions(OptionsResolver $resolver)
              {
                  $resolver->setDefaults([
                      'data_class' => Email::class,
                  ]);
              }
          }
          

          Comme je vous le dis, je crois que je ne récupere que le nom et prenom du destinataire. Or il me faudrait son email. Savez vous comment faire a partir du formulaire avec la partie bleuté ?

          Je me permets de vous joindre une petite image qui pourrait vous aider (il y a la partie bleuté desus).

          Merci a vous tous !

          Vincent


          • Partager sur Facebook
          • Partager sur Twitter

          Symfony 4 Formulaire de contact

          × 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