[SYMFONY] Passer des variables d'un formulaire dans un autre

Eléphanteau du PHP | 35 Messages

18 mai 2017, 16:41

Bonjour tout le monde,

Je n'utilise pas vraiment symfony, disons que j'ai fais une structure plus basique dans laquelle j'y greffe et les composants de symfony. https://github.com/Calaves/hybrid

Mon soucis c'est que par exemple sur une page d'accueil j'ai un premier formulaire, je souhaiterai que la personne saisisse les données et quand elle clique sur inscription elle se retrouve sur la page subscribe avec un formulaire un peu plus complet.

Je ne vois pas comment faire ça, voici le code de mon controller.
public function homeAction(){

        $usuario = new Usuarios();
        $form = $this->getFormFactory()->createBuilder(PrimeroType::class, $usuario)->getForm();
        $form->handleRequest($this->getRequest());

        if($form->isValid() && $form->isSubmitted()){
            $data = $form->getData();
            var_dump($data);
                exit();
        }

        return $this->render('home.html.twig',[
            'form'=>$form->createView()
        ]);

    }
J'arrive à bien récupérer les données avec le var_dump, mais comment faire pour que ça me retourne la page suivante tout en récupérant les données et en les plaçant dans les champs.

Merci par avance pour votre aide.
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Mammouth du PHP | 684 Messages

18 mai 2017, 22:19

Bonsoir,
J'ai eut le même soucis. Je suis partit sur une insertion en base avec au fil des étapes une mise à jour (je garde l'identifiant en session pour récupérer les données).
Mais je penses que tu peux aussi mettre en session les données du formulaire pour tout insérer au dernier moment.
Zigz4g

Eléphanteau du PHP | 35 Messages

18 mai 2017, 22:40

Merci de ta réponse mais je ne suis pas sur de bien comprendre je t'avoue que c'est nouveau pour moi.
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Mammouth du PHP | 684 Messages

18 mai 2017, 23:21

Ok, je vais essayer de donner plus d'informations. Lorsque tu récupère ton formulaire dans le isValid(). Tes données sont validées.
1. Dans ce cas, tu mets les données dans une variable de session.
2. Tu rediriges vers ta deuxième page.
3. Dans le contrôleur de ta deuxième page, tu commence par vérifier la présence de la variable qui contient les données de ton formulaire précédemment stocké en session.
4. Tu affiche ton formulaire et dans le isValid(), tu complète tes données du formulaire avec celles de la session.
5. Tu as tout dans une variable en mémoire, il faut encore persister en base de données.

C'est une solution, il en existe certainement d'autre. D'ailleurs, j'avais regardé sur le net et on trouve un Bundle qui fait ça les "form multipage".

http://stackoverflow.com/questions/2125 ... iple-pages
Zigz4g

Eléphanteau du PHP | 35 Messages

19 mai 2017, 08:22

On peut utiliser les $_SESSION ça ne pose pas de problème ? Je pense comprendre ce que tu veux dire mais dans dans le premier formulaire je fais un $data = $This->getdata() toutes mes valeurs sont regroupés dedans je fais comment pour dissocier l'username et le mail par exemple ? Donc ensuite je rédige vers le plus gros formulaire et j'ai ma variable session qui contient mes anciennes données c'est bien ça ?

Mais je les affiches comment dans mon formulaire ? Car je veux faire un placeholder dans lequel j'ajoute les infos précédemment données comme le username ici.
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Mammouth du PHP | 684 Messages

19 mai 2017, 08:52

Essaye de faire un "dump($this->getData())". Tu devrais avoir un tableau ou un objet. Si c'est un tableau tu peux le placer dans ta session.
$_SESSION['mes_data'] = $this->getData();
Dans ton autre page (autre contrôleur), tu récupère ta session.
$data = $_SESSION['mes_data'];
Ensuite tu hydrates un objet de ton formulaire avec les données de $data.
Si c'est un tableau tu peux faire $data['email'].
Zigz4g

Eléphanteau du PHP | 35 Messages

19 mai 2017, 09:33

Je viens de tester quelques trucs,

public function addAction(){

        var_dump($_POST['primero']);
        exit();

        $usuario = new Usuarios();
        $form = $this->getFormFactory()->createBuilder(InscripcionType::class, $usuario)->getForm();

        return $this->render('subscribe.html.twig',[
            'form'=>$form->createView()
        ]);

    }

Je récupère bien mes données du premier formulaire le var_dump m'affiche bien un tableau : array(2) { ["username"]=> string(4) "Demo" ["password"]=> string(4) "Demo" }

Mais je ne vois pas comment les afficher dans un placeholder dans ma vue de ce deuxième formulaire. Est ce que je devrais pas plutôt faire mon formulaire dans mon controller plutot que d'en faire un formType et du coup mettre un placeholder dedans ?
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Mammouth du PHP | 684 Messages

19 mai 2017, 10:25

Effectivement il y a cette solution d'envoyer le formulaire a un autre contrôleur. Dans ce cas, c'est a toi de gérer dans ce second contrôleur le mixe des données.
Quand tu créé ton objet Usuarios. Tu l'hydrate avec les données du premier formulaire. Ensuite tu affiche ton nouveau formulaire.
$u = new Usuarios();
$u->setUsername = $_POST['primero'];
$u->setPassword = $_POST['primero'];
Ensuite tu peux soit afficher le champ dans ton formulaire, soit mettre les données en champ caché (hidden). Par contre, tu dois faire attention a vérifier les données de nouveau pour garantir aucun changement de données par l'utilisateur.
Par contre, je ne suis pas convaincu de remettre le mot de passe dans le second formulaire.
Zigz4g

Eléphanteau du PHP | 35 Messages

19 mai 2017, 10:33

D'accord je vois ce que tu veux dire, mais comment tu l'affiches dans le champ suivant ? Car je réaffiche username dans le champ suivant, je vais tester déjà avec ta solution en champ caché, oui le password aucun intéret ;) c'est juste pour faire des tests en fait.

EDIT : Et je vais comment pour cacher un champ ? 'attr' => array( 'class' => hidden) ?

Merci de ton aide.
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Mammouth du PHP | 684 Messages

19 mai 2017, 10:38

Peux tu nous donner le code de cette classe : InscripcionType::class ?
EDIT: et celui de la classe : $usuario = new Usuarios();
Zigz4g

Eléphanteau du PHP | 35 Messages

19 mai 2017, 10:44

Aaah mais non pas besoin de placeholder ça marche avec ce que tu disais au temps pour, dans le controller suivant il suffit de faire un setusername avec la variable qui a été attribué juste avant.

Je te remercie vraiment zigz4g :)
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Eléphanteau du PHP | 35 Messages

19 mai 2017, 11:35

Arf mais du coup j'ai un soucis parce que quand je valide le second formulaire il ne reconnait plus rien

 $em = $this->getDoctrine();

        $_SESSION['username'] = $_POST['primero']['username'];
        $_SESSION['password'] = $_POST['primero']['password'];

        $usuario = new Usuarios();
        $usuario->setUsername($_SESSION['username']);
        $usuario->setPassword($_SESSION['password']);
        $form = $this->getFormFactory()->createBuilder(InscripcionType::class, $usuario)->getForm();

        $form->handleRequest($this->getRequest());

        if($form->isSubmitted() && $form->isValid()) {

            $em->persist($usuario);
            $em->flush();

        }

parce que forcément le post primero n'existe plus vu qu'il ne s'agit pas du même formulaire agrrrrr
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Mammouth du PHP | 684 Messages

19 mai 2017, 11:52

Peut-être qu'il faudrait mettre ton assignation dans la partie du if isValid, non ?

Ce que je veux dire, tu affiche ton deuxième formulaire avec le champ Username. Si tu veux permettre de saisir ton username une seconde fois.
Sinon, tu mets tes données validées lors de la validation du deuxième formulaire (dans le if du isValid et avant le persist :) ).

Est-ce bon comme cela ?
Zigz4g

Eléphanteau du PHP | 35 Messages

19 mai 2017, 11:55

J'avais essayé de mettre les variables de session dans le premier controller et dans le isSubmited et isValided mais j'avais la même erreur.

Pour ta deuxième proposition je ne suis pas sur de comprendre ?
Programmation - tuto pour débutant fait par un débutant -> http://mycodingway.com/

Mammouth du PHP | 684 Messages

19 mai 2017, 13:39

$em = $this->getDoctrine();

        $_SESSION['username'] = $_POST['primero']['username'];
        $_SESSION['password'] = $_POST['primero']['password'];

        $usuario = new Usuarios();
        $usuario->setUsername($_SESSION['username']);
        $usuario->setPassword($_SESSION['password']);
        $form = $this->getFormFactory()->createBuilder(InscripcionType::class, $usuario)->getForm();

        $form->handleRequest($this->getRequest());

        if($form->isSubmitted() && $form->isValid()) {

            $usuario->setUsername($_SESSION['username']);// ICI ???
            $usuario->setPassword($_SESSION['password']);
            $em->persist($usuario);
            $em->flush();

        }
Zigz4g