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 :

Form redirection erreur [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut Form redirection erreur
    Bonjour à tous,

    dans ma grande aventure Symfony2, j'en suis à développer un bundle que je vais partager entre plusieurs applications SF2 à savoir une inscription à une newsletter.

    Voici mon problème. Puisque le contrôleur sera partagé entre mes différentes applications, je ne peux pas me permettre de faire ma redirection (dans mes actions) comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    return $this->render('ClientUserBundle:User:create.html.twig', array(
        'form' => $form->createView()
    ));
    Etant donné que l'url ne sera pas la même depuis tous les sites..

    J'ai donc essayé quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->redirect($this->get('router')->generate($route, array('_locale' => $locale)));
    ça marche est c'est ce dont j'ai besoin, mais comme il s'agit d'un redirect, je perds les données de mon formulaire.

    est-ce que quelqu'un a une idée pour merger les deux solutions?

    Merci
    tim

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    le traitement du formulaire doit être effectué dans ton bundle.
    Une fois traité (et valide) tu peux rediriger et transmettre les données sérialisées du formulaire a la route

  3. #3
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    En fait j'ai un UserBundle => qui contient le formulaire et le controller, la validation,...

    Et un WebBundle, qui lui contient le site internet. C'est lui qui affiche le form avec une inclusion Twig ou un Render du controller de UserBundle

    Plus clair comme ça?

  4. #4
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Pas de réponse, je suppose que je ne suis pas assez précis.

    Voici mon code (twig):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {% block page %}
     
    	{% render controller('ClientUserBundle:User:edit', {'id': id}) %}
     
    {% endblock %}
    mon contrôleur:
    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
     
        public function editAction($id)
        {
            $em = $this->getDoctrine()->getManager();
     
            $request = $this->getRequest();
            $user = $em->getRepository('ClientUserBundle:User')->find($id);
            $password = $user->getPassword();
     
            $form = $this->createForm(new UserType($this->container), $user);
            print '<pre>';
            var_dump($request->request->get('Client_userbundle_usertype','salut'));
            print '</pre>';
            if ($request->getMethod() == 'POST')
            {
                $form->bindRequest($request);
     
                if ($form->isValid())
                {
                    $em = $this->getDoctrine()
                        ->getManager();
                    if ($form->getData()->getPassword() !== null)
                    {
                        $password = $form->getData()->getPassword();
     
                        $usermanager = $this->get('fos_user.user_manager');
                        $user = $this->findUserByID($user->getID());
                        $user->setPlainPassword($password);
                        $usermanager->updateUser($user, true);
                    }
                    else
                    {
                        $user->setPassword($password);
                    }
     
                    $em->persist($user);
                    $em->flush();
     
                    return $this->redirect($this->get('router')->generate($this->getRefererRoute(), array('id' => $id, 'user' => $user, 'form' => $form)));
                }
            }
     
            return $this->render('ClientUserBundle:User:edit_form.html.twig', array(
                'id' => $id,
                'user' => $user,
                'form'   => $form->createView()
            ));
        }
    et la vue appelée par mon contrôleur:
    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
     
    <form method="post" {{ form_enctype(form) }}>
    	{{ form_errors(form) }}
     
    	{{ form_row(form.email) }}
    	{{ form_row(form.username) }}
    	{{ form_row(form.password) }}
     
    	{{ form_row(form.firstname) }}
    	{{ form_row(form.lastname) }}
    	{{ form_row(form.civility) }}
    	{{ form_row(form.birthdate) }}
    	{{ form_row(form.language) }}
     
        {{ form_widget(form._token) }}
        <p>
            <button type="submit" class="btn uppercase btn-primary">Enregistrer</button>
        </p>
    </form>
    Si je mets dans la 2ème vue (celle du formulaire) l'action du form sur la route de mon contrôleur, tout fonctionne, mais en cas d'erreur je suis redirigé vers sa propre route (pas bien, car je sors du site). Si aucune erreur, il réaffiche le form à l'intérieur de mon site (bien).

    Maintenant si je ne renseigne pas l'action de mon form et que je le valide, le comportement est idéal, puisque je reste à l'intérieur de mon site (la page ne fait que de se rafraîchir). Par contre, mon contrôleur n'a pas accès au $this->getRequest(), qui n'a l'air de ne contenir que les données de la page renvoyée en GET et pas les données de mon formulaire.
    PS : si je fais un dump de $_POST, je retrouve bien mes données...

    Est-ce que quelqu'un a déjà été dans ce cas?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Par défaut
    Salut,

    Au risque de dire une connerie, ton bundle doit être totalement indépendant des autres.
    Pour ça tu devrais gérer le paramètre d'url dans le configuration du bundle

    http://symfony.com/fr/doc/2.2/cookbo...#configuration

    a+

  6. #6
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Citation Envoyé par matlow Voir le message
    Salut,

    Au risque de dire une connerie, ton bundle doit être totalement indépendant des autres.
    Pour ça tu devrais gérer le paramètre d'url dans le configuration du bundle

    http://symfony.com/fr/doc/2.2/cookbo...#configuration

    a+
    Hello,
    mon bundle web ne fait qu'afficher un formulaire qui doit être traité par mon userbundle qui s'occupe de tout le traitement.
    c'est justement pour ça que j'ai besoin de ce système

    voici comment je l'ai implémenté
    (twig)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% render controller('ClientUserBundle:User:edit', {'id': id, 'request': app.request}) %}
    (controller)
    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
        public function editAction($id, $request)
        {
            $em = $this->getDoctrine()->getManager();
     
            // $request = $this->getRequest();
            $user = $em->getRepository('ClientUserBundle:User')->find($id);
            $password = $user->getPassword();
     
            $form = $this->createForm(new UserType($this->container), $user);
            if ($request->getMethod() == 'POST')
            {
                $form->bindRequest($request);
     
                if ($form->isValid())
                {
                    $em = $this->getDoctrine()
                        ->getManager();
                    if ($form->getData()->getPassword() !== null)
                    {
                        $password = $form->getData()->getPassword();
     
                        $usermanager = $this->get('fos_user.user_manager');
                        $user = $this->findUserByID($user->getID());
                        $user->setPlainPassword($password);
                        $usermanager->updateUser($user, true);
                    }
                    else
                    {
                        $user->setPassword($password);
                    }
     
                    $em->persist($user);
                    $em->flush();
                }
            }
     
            return $this->render('ClientUserBundle:User:edit_form.html.twig', array(
                'id' => $id,
                'user' => $user,
                'form'   => $form->createView()
            ));
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/02/2006, 16h47
  2. Forms 6i : Erreur interne lors de la compilation
    Par Veve44 dans le forum Forms
    Réponses: 4
    Dernier message: 10/10/2005, 14h22
  3. FORMS et erreur ORA-XXXXX
    Par Nounoursonne dans le forum Forms
    Réponses: 2
    Dernier message: 06/10/2005, 21h01
  4. [FORMS][6i] Erreur non explicitée
    Par badara1 dans le forum Forms
    Réponses: 15
    Dernier message: 13/05/2005, 10h56
  5. [Forms 6i] Erreur FRM-30187 : longueur ?
    Par macben dans le forum Forms
    Réponses: 13
    Dernier message: 08/11/2004, 15h45

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