Bonjour, je rencontre un problème pour le traitement d'un formulaire dans le footer de mon site, qui est donc visible sur toutes les pages de mon site. Je suis sous Symfony 5.2.6.

Dans mon template de base, j'appelle la fonction index() du controleur Footer :

{{ render(controller('App\\Controller\\FooterController::index')) }}

La fonction index() affiche le formulaire et est sensée enregistrer le champ email en base de données:

public function index(Request $request, EntityManagerInterface $manager): Response
    {
        $newsletter = new Newsletter();

        $newsletterForm = $this->createForm(NewsletterType::class, $newsletter);

        $newsletterForm->handleRequest($request);

        if ($newsletterForm->isSubmitted() && $newsletterForm->isValid()) {
            $newsletter->setRegisteredAt(new \DateTime());

            $manager->persist($newsletter);
            $manager->flush();
        }

        return $this->render('footer/index.html.twig', [
            'newsletterForm' => $newsletterForm->createView(),
        ]);
    }

Et voici le NewslettrerType, basé sur l'entité Newsletter :

<?php

namespace App\Form;

use App\Entity\Newsletter;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class NewsletterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', EmailType::class, [
                'attr' => [
                    'placeholder' => 'Votre adresse email',
                    'class' => 'form-control'
                ],
                'label' => false
            ])
            ->add('submit', SubmitType::class, [
                'attr' => [
                    'class' => 'btn btn-primary'
                ],
                'label' => 'S\'inscrire'
            ]);
    }

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

Quand je soumets le formulaire absolument ne se passe. Merci pour votre aide :)

3 réponses


Curvata
Réponse acceptée

Bonsoir,

je pense qu'il faudrait changer l'action de ton formulaire "newsletterForm" afin de le renvoyer dans ton "FooterController".

hugolive
Auteur

Bonjour,

Ah ! Effectivement ça fonctionne ! Voici ce que j'ai fait :

  • Dans l'affichage de mon formulaire j'ai modifié le champ action pour rediriger vers mon FooterController comme tu m'as dit:
    {{ form_start(newsletterForm, { 'action': path('newsletter_inscription') }) }}
            <div class="row">
                <div class="form-group mr-2">
                    {{ form_row(newsletterForm.email) }}
                </div>
                <div class="form-group">
                    {{ form_row(newsletterForm.submit) }}
                </div>
            </div>
    {{ form_end(newsletterForm) }}
  • puis dans mon FooterController, si le formulaire est traité, je suis renvoyé à l'URL où a été soumis le formulaire :

    class FooterController extends AbstractController
    {
    /**
     * @Route("/newsletter/inscription", name="newsletter_inscription")
     */
    public function index(Request $request, EntityManagerInterface $manager): Response
    {
        $newsletter = new Newsletter();
    
        $newsletterForm = $this->createForm(NewsletterType::class, $newsletter);
    
        $newsletterForm->handleRequest($request);
    
        dump($newsletterForm);
    
        if ($newsletterForm->isSubmitted() && $newsletterForm->isValid()) {
            $newsletter->setRegisteredAt(new \DateTime());
            $newsletter->setConfirm(false);
    
            $manager->persist($newsletter);
            $manager->flush();
    
            return $this->redirect($request->server->get('HTTP_REFERER'));
        }
    
        $response = $this->render('footer/_index.html.twig', [
            'newsletterForm' => $newsletterForm->createView(),
        ]);
    
        $response->setPublic();
        $response->setMaxAge(600);
    
        return $response;
    }

Je ne sais pas si c'est la méthode la plus propre, en tout cas cela fonctionne donc un grand merci à toi :)

Penses à mettre le sujet en résolu