IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Redirection après validation de formulaire


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 33
    Points : 19
    Points
    19
    Par défaut Redirection après validation de formulaire
    Bonjour,

    J'ai un problème de redirection d'url après validation d'un formulaire en post dans un service que j'ai créé.

    Je voudrais que l'on arrive sur une nouvelle page une fois le formulaire bien rempli mais ça ne marche pas.

    Voici le service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    <?php
     
    namespace Europe\VoyageBundle\Services\Voyage;
     
    use Doctrine\ORM\EntityManager;
    use Symfony\Component\HttpFoundation\RequestStack;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\Routing\RouterInterface;
    use Symfony\Component\Form\FormFactory;
     
    class RechercheManager {
     
        private $em;
        private $req;
        private $ri;
        private $ff;
        private $form;
     
        public function __construct(EntityManager $em, RequestStack $req, RouterInterface $ri, FormFactory $ff)
        {
            $this->em=$em;
            $this->req=$req->getCurrentRequest();
            $this->ri=$ri;
            $this->ff=$ff;
        }
     
        public function setForm($formType, $recherche, $url=null)
        {
           $form=$this->ff->create($formType,$recherche);
     
           if ($this->req->getMethod() === 'POST')
           {
               $form->bind($this->req);
     
                if ($form->isValid())
                {
                    $this->em->persist($recherche);
                    $this->em->flush();
     
                    if (!$url==null)
                    $this->redirect($url, $recherche);
                    //La méthode redirect est écrite ci dessous
                }
           }
     
           $this->form=$form;
        }
     
        public function getForm()
        {
            return $this->form->createView();
        }
     
        protected function redirect($url, $recherche)
        {
            $url=$this->ri->generate($url, array('id'=>$recherche->getId()));
     
            //L'url est bien généré mais c'est ceci qui ne fonctionne pas :
            return new RedirectResponse($url);
        }
     
    }
    Il y a bien insertion dans la base de donnée, mais je n'arrive pas à faire la redirection après. Comment pallier à ce problème?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Ta méthode redirect renvoit un objet Response, pour autant je ne vois pas ou il serait utilisé, ta méthode setForm ne le renvoit rien, et de plus nous n'avons pas le code de ton controller, car c'est lui au final qui doit renvoyer cet objet Response.
    A vrai dire je ne pense pas que ce soit dans un service qu'il faille faire une redirection.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     if ($form->isValid())
                {
                    $this->em->persist($recherche);
                    $this->em->flush();
     
                    if (!$url==null)
                    return $this->redirect($url, $recherche);
                    //La méthode redirect est écrite ci dessous
                }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    En fait, voici le code actuel de mon controlleur ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    <?php
     
    namespace Europe\VoyageBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
     
    use Europe\VoyageBundle\Entity\RechercheVoyage;
    use Europe\VoyageBundle\Entity\Hotel;
     
    use Europe\VoyageBundle\Form\RechercheVolHotelType;
    use Europe\VoyageBundle\Form\RechercheHotelType;
    use Europe\VoyageBundle\Form\RechercheVolType;
     
    class DefaultController extends Controller
    {
        public function indexAction()
        {
            $recherche=new RechercheVoyage($nbp=2);
            $form=$this->createForm(new RechercheVolHotelType(),$recherche);
        $em=$this->getDoctrine()->getManager();
     
            $req=$this->getRequest();
            if($req->getMethod() == 'POST')
            {
                $form->bind($req);
     
                if ($form->isValid())
                {
                    $em->persist($recherche);
                    $em->flush();
     
     
                    return $this->redirect($this->generateUrl('europe_voyage_recherche_hotels', array('id'=>$recherche->getId(),'page'=>1)));
                }
            }
     
            return $this->render('EuropeVoyageBundle:Default:index.html.twig', array(
                    'form'=>$form->createView(),
                    ));
        }
     
        public function indexHotelAction()
        {
            $em=$this->getDoctrine()->getManager();
            $hr=$em->getRepository('EuropeVoyageBundle:Hotel');
     
            $rechercheHotel=new RechercheVoyage();
     
            $form=$this->createForm(new RechercheHotelType(), $rechercheHotel);
     
            $request=$this->getRequest();
                if ($request -> getMethod() === 'POST')
                {
                    $form->bind($request);
     
                    if($form->isValid())
                    {
                        $em->persist($rechercheHotel);
                        $em->flush();
     
                        return $this->redirect($this->generateUrl('europe_voyage_recherche_hotels', array('id'=>$rechercheHotel->getId(),'page'=>1)));
                    }
                }
     
            return $this->render('EuropeVoyageBundle:Default:indexHotel.html.twig', array(
                        'form'=>$form->createView(),
                        'hotels'=>$hr->findAll(),
                        'path'=>2,
                            ));
        }
     
        public function indexVolAction()
        {
            $em=$this->getDoctrine()->getManager();
     
            $recherche=new RechercheVoyage();
     
            $form=$this->createForm(new RechercheVolType(), $recherche);
     
            $request=$this->getRequest();
                if ($request -> getMethod() === 'POST')
                {
                    $form->bind($request);
     
                    if($form->isValid())
                    {
                        $em->persist($recherche);
                        $em->flush();
     
                        return $this->redirect($this->generateUrl('europe_voyage_recherche_vols', array('id'=>$recherche->getId(),'page'=>1)));
                    }
                }
     
            return $this->render('EuropeVoyageBundle:Default:indexVol.html.twig', array('form'=>$form->createView()));
        }
     
    }
    J'ai remarqué que les méthodes des controlleurs pouvaient devenir très longues et répétitives, et je croyais que cela était problématique j'ai eu l'idée de créer un service pour mettre en commun certaines actions, mais finalement, on m'a dit sur un autre forum que ce n'était pas vraiment utile, donc j'ai abandonné mon idée de service qui n'était peut être pas si bonne que ça, après tout, autant ne pas essayer de réinventer la roue (ce serait dommage avec sf quand même)

  4. #4
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    J'ai remarqué que les méthodes des controlleurs pouvaient devenir très longues et répétitives, et je croyais que cela était problématique j'ai eu l'idée de créer un service pour mettre en commun certaines actions, mais finalement, on m'a dit sur un autre forum que ce n'était pas vraiment utile, donc j'ai abandonné mon idée de service qui n'était peut être pas si bonne que ça, après tout, autant ne pas essayer de réinventer la roue (ce serait dommage avec sf quand même)
    Le contrôleur doit effectivement contenir le minimum de code possible : il récupère une requête et renvoie une réponse : le reste doit être placé dans des services.
    Par contre, une redirection qui correspond à une réponse doit elle apparaitre dans le contrôleur et non dans le service.

    Concernant ton problème, es-tu sûr d'arriver jusqu'à la partie du code qui fait la redirection ? Si ce n'est pas le cas c'est en amont qu'il faut voir ou ça bloque (form non valide, problème lors du flush ...), si c'est le cas, alors il faudra creuser coté routing.

    ++

Discussions similaires

  1. Redirection après validation formulaire
    Par valmeras dans le forum Langage
    Réponses: 4
    Dernier message: 26/03/2014, 14h18
  2. redirection apres validation formulaire
    Par liniver dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 24/11/2013, 23h34
  3. [SP-2010] redirection après validation formulaire.
    Par doctori dans le forum SharePoint
    Réponses: 15
    Dernier message: 20/07/2011, 14h37
  4. redirection après validation formulaire
    Par princesse95 dans le forum Langage
    Réponses: 15
    Dernier message: 19/02/2009, 22h52
  5. Récupération valeur après validation du formulaire
    Par Bluespike62 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/01/2006, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo