Bonjour la communauté,
J'ai créé un formuaire tout à fait basique afin de créer une campagne publicitaire.
Donc j'ai un formulaire qui va me permettre de créer cette entité Campaign.
J'aimerai pouvoir valider ce formulaire en trois fois.
Dans un premier temps, je créé ma campagne avec ses données essentielles donc non nullables, soit j'enregistre et je quitte, soit je clique sur suivant.
En cliquant sur suivant, je récupère ma campagne actuelle et je tombe sur un autre formulaire qui viendra ajouter son contenu. Même chose, soit j'enregistre et je quitte soit je clique sur suivant.
En cliquant sur suivant, je récupère donc la campagne et je tombe sur un autre formulaire qui viendra lui affilier une liste de contacts.

Ma question est comment je peux faire pour enregistrer ma campagne et passer ses éllément dans le bouton SubmitType alias suivant ?

Voici mon formulaire :

<?php

namespace App\Form;

use DateTime;
use App\Entity\User;
use App\Entity\Listing;
use App\Entity\Campaign;
use App\Repository\UserRepository;
use App\Repository\ListingRepository;
use Symfony\Component\Form\AbstractType;
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\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;

class FormAddCampaignType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class, [
                'label' => 'Nom de la campagne'
            ])
            ->add('subject', TextType::class, [
                'label' => 'Objet'
            ])
            ->add('senderName', TextType::class, [
                'label' => 'Nom de l\'envoyeur'
            ])
            ->add('senderEmail', EmailType::class, [
                'label' => 'Email de l\'envoyeur'
            ])

            ->add('content', TextareaType::class, [
                'label' => 'Contenu'
            ])
            ->add('listing', EntityType::class, [
                'class' => Listing::class,
                'query_builder' => function (ListingRepository $lr) {
                    return $lr->createQueryBuilder('l')
                        ->orderBy('l.title', 'ASC');
                },
                'choice_label' => 'title',
                'label' => 'Nom de la liste',
                'expanded' => true,
                'multiple' => true,
                'mapped' => true,
                'required' => false,
            ])

            ->add('sendedAt', DateType::class, [
                'label' => 'Date d\'envoi',
                'data' => new \DateTime("now")
            ])

            ->add('saveAndLeave', SubmitType::class, [
                'label' => 'Sauvegarder et quitter'
            ])
            ->add('saveAndAdd', SubmitType::class, [
                'label' => 'Suivant'
            ])
            ->getForm()
            ;
    }

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

Voici mon controller :

/**
     * @Route("/campaign/addDonnees", name="campaign.addDonnees")
     * @IsGranted("ROLE_USER")
     */
    // Méthode qui affiche le formulaire d'ajout de données d'une campagne
    public function addDonneesToCampaign(Request $request)
    {   
        $oneCampaign = new Campaign(); // On instancie une nouvelle campagne
        $oneCampaign->setUser($this->getUser()); // On lui affilie l'id de l'utilisateur courant 

        $form = $this->createForm(FormAddCampaignType::class, $oneCampaign); // On créé un formulaire à partir des données de $oneCampaign
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid())
        {
            $oneCampaign = $form->getData(); // On récupère les valeurs du formulaire
            $entitymanager = $this->getDoctrine()->getManager(); // On récupère l'EntityManager pour manipuler l'entité

            if($form->getClickedButton() === $form->get('saveAndLeave')) // Bouton où on enregistre et on quitte la création
            {
                $entitymanager->persist($oneCampaign); // On injecte les données dans la BDD
                $entitymanager->flush(); // On met à jours la BDD
                $this->addFlash('success', 'La campagne a bien été créée');
                return $this->redirectToRoute('campaign.index');

            }
            else if($form->getClickedButton() === $form->get('saveAndAdd')) // Bouton où on enregistre et on continue la création
            {
                $entitymanager->persist($oneCampaign); // On injecte les données dans la BDD
                $entitymanager->flush(); // On met à jours la BDD
                $this->addFlash('success', 'La campagne a bien été créée');
                return $this->redirectToRoute('campaign.addContent');
            }
        }

        return $this->render('campaign/addDonnees.html.twig', [
            'form' => $form->createView()
        ]);
    }
    /**
     * @Route("/campaign/{id}/addContent", name="campaign.addContent")
     * @IsGranted("ROLE_USER")
     */
    public function addContentToCampaign(Campaign $campaign, Request $request, EntityManagerInterface $emi)
    {
        $form = $this->createForm(FormAddCampaignType::class, $campaign); // On créé un formulaire à partir des données de $campaign
        $form->handleRequest($request);

        if($form->getClickedButton() === $form->get('saveAndLeave')) // Bouton où on enregistre et on quitte la création
            {
                $entitymanager->flush(); // On met à jours la BDD
                $this->addFlash('success', 'Le conteu a bien été ajouté à la campagne');
                return $this->redirectToRoute('campaign.index');

            }
            else if($form->getClickedButton() === $form->get('saveAndAdd')) // Bouton où on enregistre et on continue la création
            {
                $entitymanager->flush(); // On met à jours la BDD
                $this->addFlash('success', 'Le conteu a bien été ajouté à la campagne');
                return $this->redirectToRoute('campaign.addContent');
            }

        return $this->render('campaign/addContent.html.twig', [
            'form' => $form->createView(),
            'campaign' => $campaign
        ]);
    }

    /**
     * @Route("/Campaign/{id}/addList", name="campaign.addList")
     * @IsGranted("ROLE_USER")
     */
    public function addListToCampaign(Campaign $campaign, Request $request, EntityManagerInterface $emi)
    {
        $form = $this->createForm(FormAddCampaignType::class, $campaign); // On créé un formulaire à partir des données de $campaign
        $form->handleRequest($request);

        if($form->getClickedButton() === $form->get('saveAndLeave')) // Bouton où on enregistre et on quitte la création
            {
                $entitymanager->flush(); // On met à jours la BDD
                $this->addFlash('success', 'La liste a bien été ajoutée à la campagne');
                return $this->redirectToRoute('campaign.index');

            }
            else if($form->getClickedButton() === $form->get('saveAndAdd')) // Bouton où on enregistre et on continue la création
            {
                $entitymanager->flush(); // On met à jours la BDD
                $this->addFlash('success', 'La liste a bien été ajoutée à la campagne');
                return $this->redirectToRoute('campaign.addContent');
            }

        return $this->render('campaign/addContent.html.twig', [
            'form' => $form->createView(),
            'campaign' => $campaign
        ]);
    }

    /**
     * @Route("/campaign/{id}/edit", name="campaign.edit")
     * @IsGranted("ROLE_USER")
     */
    // Méthode qui modifie la campagne
    public function edit(Campaign $campaign, Request $request, EntityManagerInterface $emi)
    {
        // On s'assure que la personne connectéé est bien la personne qui a créé la campagne ou si c'est l'administrateur
        // Si non, on la redirige vers la liste des campagnes
        // Ceci est une sécurité au niveau de l'accès par l'URL
        if(!$this->isGranted('ROLE_ADMIN') && $this->getUser()->getId() !== $campaign->getUser()->getId()){
            $this->addFlash('error', 'Vous n\'avez pas les droits pour y aller !!!');
            return $this->redirectToRoute('campaign.index');
        }

        $form = $this->createForm(FormAddCampaignType::class, $campaign); // On créé un formulaire à partir des données de $campaign
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid())
        {
            $emi->flush(); // On met à jour la BDD
            $this->addFlash('success', 'La campagne a bien été modifiée');

            return $this->redirectToRoute('campaign.index');
        }

        return $this->render('campaign/edit.html.twig', [
            'form' => $form->createView(),
            'campaign' => $campaign
        ]);
    }

Voici mon template :

{% extends 'base.html.twig' %}

{% block title %}Formulaire d'ajout d'une campagne{% endblock %}

{% block body %}
<div class="container">
    <h1 class="mb-4">Ajout d'une campagne</h1>
    <div class="row mt-4 mb-4">
        <a href="" class="btn btn-warning">Données de la campagne</a>
    </div>
    <div class="row">
        <div class="col-md-12">
            {{ form_start(form) }}
                {{ form_row(form.title) }}
                {{ form_row(form.subject) }}
                {{ form_row(form.senderName) }}
                {{ form_row(form.senderEmail) }}
                {{ form_row(form.saveAndLeave) }}
                {{ form_row(form.saveAndAdd) }}
            {{ form_end(form, {'render_rest': false}) }}
        </div>
    </div>
</div>
{% endblock %}

Je précise aussi que je ne peux pas valider la validation du premier formulaire ( addDonnees ).

Merci à vous :)

Aucune réponse