Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] 2 formulaires sur la même page

Sujet résolu
    21 janvier 2018 à 11:49:04

    Bonjour,

    j'ai une page listant des adresses mail interdites (url /banned).

    Sur cette page, il y a un champ pour ajouter une nouvelle adresse mail à bannir (form1),  qui appelle /banned avec l'email en paramètre POST, requête gérée par la fonction du controleur qui affiche également la liste des adresses.

    Pour chaque adresse listée, il y a un bouton à coté pour débloquer cette adresse (form2), qui appelle /unban/{id} pour débloquer l'adresse correspondante, la requête est gérée par une autre fonction du controleur.

    Les 2 formulaires sont créés dans la fonction affichant la liste des adresses.

    Est-ce la bonne manière de réaliser ça ?

    Mon problème est que dans le controleur pour débloquer l'adresse, le $form->handleRequest($request)->isValid() n'est jamais vrai. Ce qui me parait logique car $form est juste un formulaire vide créé dans cette fonction.

    Merci d'avance pour votre aide.

    Fonction du controleur pour lister et bloquer une adresse :

    public function listBannedEmailAddressAction(Request $request)
        {
            $em = $this->getDoctrine()->getManager();
    
            // Create new form
            $ba = new BannedAddress();
            $formBan = $this->get('form.factory')->create(BannedAddressType::class, $ba);
    
            // Empty form, just to handle CSRF token
            $formUnban = $this->get('form.factory')->create();
            
            // If there is a client request
            if ($request->isMethod('POST') && $formBan->handleRequest($request)->isValid()) {
                //Fetch the address from post request
                $params = $request->request->all();
                $bannedAddress = new BannedAddress();
                $addressToBan = $params['banned_address']['emailAddress'];
                $bannedAddress->setEmailAddress($addressToBan);
    
                // Save in database
                $em->persist($bannedAddress);
                $em->flush();
    
                $request->getSession()->getFlashBag()
                        ->add('info', $this->get('translator')
                                ->trans('admin.ban.flashbag.banned', array('%address%' => $addressToBan)));
            }
    
            $listAddresses = $em->getRepository('A2CPlatformBundle:BannedAddress')->findAll();
    
            return $this->render('A2CPlatformBundle:Admin:ban.html.twig', array(
                        'listAddresses' => $listAddresses,
                        'formBan' => $formBan->createView(),
                        'formUnban' => $formUnban->createView())
            );
        }

    Fonction du controleur pour débloquer une adresse :

    /**
         * @ParamConverter("bannedAddress", class="A2CPlatformBundle:BannedAddress")
         */
        public function unbanEmailAddressAction(Request $request, BannedAddress $bannedAddress)
        {
            $em = $this->getDoctrine()->getManager();
    
            // Empty form, just to handle CSRF token
            $form = $this->get('form.factory')->create();
    
            if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
                $em->remove($bannedAddress);
                $em->flush();
    
                $addressToUnban = $bannedAddress->getEmailAddress();
    
                $request->getSession()->getFlashBag()
                        ->add('info', $this->get('translator')
                                ->trans('admin.ban.flashbag.unbanned', array('%address%' => $addressToUnban)));
    
                return $this->redirectToRoute('a2c_platform_admin_listbanned');
            }
           //return $this->render('A2CPlatformBundle:Admin:ban.html.twig');
           return $this->redirectToRoute('a2c_platform_admin_listbanned');
        }




    -
    Edité par Vinc 21 janvier 2018 à 11:52:49

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2018 à 16:06:53

      Tu fais une requête pour récupérer toutes les adresses bannies, tu ajoute un formulaire avec un seul champs de type TextType ou EmailType, et lorsque ton formulaire est renvoyé, tu persiste l'adresse bannie, de façon très classique.

      Pour dé-bannir une adresse:

      • Tu créés une fonction unbannedAction dans le contrôleur. Elle aura pour fonction de supprimer l'adresse de la BDD.
      • Tu créés une route unbanned/{id} qui pointe sur unbannedAction.
      • Dans la vue qui affiche les adresses, tu mets un lien "unban" à côté de chaque adresse, qui contiendra juste un href ="{{ path('unbanned', {'id': adresse.id}) }}".

      Ainsi sur une seule page tu peux ajouter une adresse à la liste, et en retirer une.

      • Partager sur Facebook
      • Partager sur Twitter
        30 janvier 2018 à 14:31:27

        Merci HarvestR pour ta réponse.

        Pour la partie "bannir", pas de problème ça marche bien.

        Si je suis ton idée et que j'ajoute simplement un lien à côté de chaque adresse, et non un formulaire, comment gérer le CSRF ? Je ne pourrais pas protéger le site d'un attaquant qui envoie un lien du type www.site.com/unbanned/7

        Qu'en penses-tu ?

        • Partager sur Facebook
        • Partager sur Twitter
          31 janvier 2018 à 5:31:13

          Tu peux passer par les ROLES des utilisateurs (firewall). Si l'utilisateur n'es pas authentifié, alors tu refuses l'action et tu retournes un message d'erreur. Dans ton contrôleur, ça donne quelque chose du genre :

          if(!$this->get('security.authorization_checker')->isGranted('ROLE_ADMIN'){
          // ...
          }

          Mais ça t'oblige a gérer un minimum l'authentification sur ton site. Dans mon exemple, je vérifie si l'utilisateur a les droits d'administration, mais bien sûr tu peux adapter à ton besoin.

          • Partager sur Facebook
          • Partager sur Twitter

          [Symfony] 2 formulaires sur la même page

          × 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