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

 PHP Discussion :

[Jobeet] Problème avec un formulaire [1.x]


Sujet :

PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut [Jobeet] Problème avec un formulaire
    Bonsoir.

    Désolé, j'ai pas pu faire mieux pour le titre étant donné que je débute dans Symfony et que je ne sais pas trop comment nommer les choses.

    Voici mon ContactForm.class.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      public function configure()
      {
    //    unset($this['_csrf_token']);
     
        $this->setWidgets(array(
          'name'    => new sfWidgetFormInputText(),
          'email'   => new sfWidgetFormInputText(),
          'message' => new sfWidgetFormTextarea(),
        ));
     
        // Ici un truc qu'on va utiliser lors de la redirection de l'internaute après soumission
        $this->widgetSchema->setNameFormat('contact[%s]');
    $this->widgetSchema->setNameFormat('contact[%s]'); est la ligne qui nous intéresse.

    Voici mon action.class.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function executeSubmit($request)
      {
        $request->checkCSRFProtection();
        $this->forward404Unless($request->isMethod('post'));
     
        // Voir ContactForm.class.php, au sujet de "getParameter('contact')" qu'on a construit grâce à "setNameFormat('contact[%s]')" :
        $this->redirect('contact/thankyou?'.http_build_query($request->getParameter('contact')));
      }
    Et voici ma page thanksSuccess.php "Merci d'avoir envoyé blabla" (qui affiche donc un récapitulé de ce que l'internaute à envoyé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <p>Votre message a bien été envoyé !</p>
     
    <!--<ul>
      <li>Name:    <?php echo *** ?></li>
      <li>Email:   <?php echo *** ?></li>
      <li>Message: <?php echo *** ?></li>
    </ul>-->
    Comme vous pouvez le voir, je ne sais pas quoi mettre pour afficher le nom, l'email et le message récupéré du formulaire

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Il manque le code le plus intéressant pour résoudre l'énigme, celui de la méthode executeThanks qui prépare les données pour ton template.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Non, malheureusement ça n'est pas la plus intéressante.
    La méthode est vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function executeThanks()
    {
    }
    Elle n'est présente que pour permettre d'afficher le template.
    Tout est sensé fonctionner comme ça, j'ai suivit à la lettre le tuto suivant : http://www.symfony-project.org/forms...-Form-Creation

    Simplement, ils sont marrant, mais après refactorisation des méthodes configure() et executeSubmit(), ils nous laissent en plan en oubliant d'expliquer comment changer le code dans thanksSucess.php. -_-

    D'où ma grande détresse, étant donné que Symfony a son propre langage qu'il est impossible de deviner.

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <!--<ul>
      <li>Name:    <?php echo *** ?></li>
      <li>Email:   <?php echo *** ?></li>
      <li>Message: <?php echo *** ?></li>
    </ul>-->
    Qu'y a-t-il derrière les ** ?

    A mon avis le problème vient de là. Relis bien l'exemple.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Justement, il n'y a rien derrière les ***.

    Au départ, le tuto fournit les codes complets pour :
    - ContactForm.class.php
    - action.class.php
    - thanksSuccess.php

    Ensuite j'ai expliqué qu'ils proposent de refactoriser :
    - ContactForm.class.php => configure()
    - action.class.php => executeSubmit()

    ... mais ne donnent pas le nouveau code pour thanksSuccess.php ! Or, dans l'état où il est, il ne peut plus fonctionner (les instructions ne sont plus valides).

    En fait la 1ère version des fichiers propose de construire un array "$params" constitué de 3 paramètres 'name', 'email' et 'message' que l'on associe aux widgets (enfin ce qui est passé via le formulaire hein). Ensuite on passe le tableau via le http_build_query($params) et puis on récupère celà avec un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <li>Name:    <?php echo $sf_params->get(name) ?></li>
    Mais la refactorisation propose de se passer de la construction d'un tableau pour directement utiliser un "truc" (on ne nous explique pas ce que c'est) nommé "contact", sensé contenir les paramètres, et construit via cette ligne totalement mystique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->widgetSchema->setNameFormat('contact[%s]');
    A partir de là on utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http_build_query($request->getParameter('contact'))
    ... et après c'est le drame puisqu'on ne sait pas comment utiliser celà
    ____________________

    Bref, je cherche juste quelqu'un pour me dire comment appeler ce qui est passé via le http_build_query($request->getParameter('contact')).

    J'ai essayé 15000 trucs pendant 3h.

    Le seul truc qui ne me met pas un message d'erreur, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <li>Name:    <?php echo $sf_request->getParameter(blablabla*) ?></li>
    Mais je n'obtiens qu'une liste à puce à moitié vide, où il n'y a rien après "Name: " et "Email: " et "Message: "...

    (*) je peux mettre ce que je veux là-dedans, que ce soit 'contact[name]' ou 'name' ou 'carotte', Symfony n'en a rien à faire et ne m'affiche aucun message pour me dire "carotte n'existe pas"...

    Ça laisse un peu à désirer tout ça. Alors, vous me direz :
    "oui bon mais tu n'as qu'à te passer de la refactorisation et garder la 1ère version du code"
    . Seulement, mon objectif est de comprendre plutôt que d'abandonner, car tôt ou tard le problème se reposera.

  6. #6
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Je n'ai pas essayé ce tuto et mes souvenirs de mon bref passage sur Symfony sont un peu vagues faute d'y avoir touché récemment, mais voici mes suggestions sur le sujet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->widgetSchema->setNameFormat('contact[%s]');
    permet, si ma mémoire est bonne, de renommer les champs du formulaire tels qu'ils vont apparaitre dans la requête POST subséquente à sa validation. Les champs du POST seront donc nommés contact['name'], contact['email'], etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http_build_query($request->getParameter('contact'))
    reconstruit une requête dans l'URL en fonction du tableau. On devrait donc avoir dans le GET qui s'ensuit, donc dans le $request qui va être traité par l'action, une série de champs (paramètres) nommés 'name', 'email', etc.

    Pour vérifier ce qu'il en est exactement, ma suggestion serait de faire des dumps dans tes actions.

    Dans executeSubmit(), pour vérifier comment est appelée la page suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sfContext::getInstance()->getLogger()->debug('contact/thankyou?'.http_build_query($request->getParameter('contact')));
    et/ou dans executeThanks() pour se rassurer et vérifier que les paramètres ont bien le nom voulu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sfContext::getInstance()->getLogger()->debug(print_r($request->getParameters(), true));
    Une fois vérifiés les paramètres, je conseillerai de préparer leur lecture dans l'action plutôt que de lire directement $request dans le template.

  7. #7
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Ce qui n'est pas simple dans symfony, c'est que c'est modulable et que la liaison entre les modules n'est pas toujours des plus évidente (surtout si les modules sont composées de modules eux même composés (le cas des form) ).

    La commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->widgetSchema->setNameFormat('contact[%s]');
    que l'on ne trouve que dans un objet form, permet de spécifier la manière dont les arguments du formulaires pourront être récupéré. Ici, pour un champ nom, il apparaitra sous la forme de contact['non']='titi' ce qui est ... une structure de tableau. Il est donc possible dans l'objet sfWebRequest de récupérer tous les champs d'un formulaire sous forme d'un tableau en récupérant le paramètres contact.

    Pour récupérer des données dans un templates, il faut (faudrait) qu'elles soient préparée dans le contrôleur. Ici, elle sont transmissent par l'url sous forme d'argument sorti du tableau (le fonction PHP http_build_url) prend un tableau d'argument en argument et les transformes en une url valide. Donc notre champs "nom" va se retrouver dans l'url sous la forme d'un www.truc.ici?nom=Durant.

    Reste a récupérer la chose, je ne ferais pas comme dans le tuto, mais plus "symfony", dans le contrôleur, récupération des paramètres dans un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function executeThanks(sfWebRequest $request)
    {
       $this->param = $request->getParameters();
    }
    et le template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    <!--<ul>
      <li>Name:    <?php echo $param['nom'] ></li>
      <li>Email:   <?php echo *** ></li>
      <li>Message: <?php echo *** ></li>
    </ul>-->
    A noter que dans le template, le $this disparaît. A noter aussi que les variables sont escaper.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Herode Voir le message
    Dans executeSubmit(), pour vérifier comment est appelée la page suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sfContext::getInstance()->getLogger()->debug('contact/thankyou?'.http_build_query($request->getParameter('contact')));
    et/ou dans executeThanks() pour se rassurer et vérifier que les paramètres ont bien le nom voulu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sfContext::getInstance()->getLogger()->debug(print_r($request->getParameters(), true));
    Ça me donne l'erreur suivante :
    Notice: Undefined variable: request in P:\BOULOT\WEB\Twan\symfony\apps\frontend\modules\contact\actions\actions.class.php on line 36

    Fatal error: Call to a member function getParameters() on a non-object in P:\BOULOT\WEB\Twan\symfony\apps\frontend\modules\contact\actions\actions.class.php on line 36
    ------------------

    Reste a récupérer la chose, je ne ferais pas comme dans le tuto, mais plus "symfony", dans le contrôleur, récupération des paramètres dans un tableau
    Exactement le même message d'erreur

    Bon, j'vais zapper leur refactorisation. Tant pis, marre de bloquer. Mais ça m'fout les boules, vraiment.

    Merci pour votre coup d'main

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Bon, fallait s'en douter, impossible de continuer les tutos suivant sans appliquer à la lettre leur refactorisation.

    Je relance donc le sujet pour arriver à savoir comment solutionner le problème.

  10. #10
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Peux-tu mettre un lien vers je tuto que tu utilises, qu'on soit sur de parler du même.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  11. #11
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    @michel : il parle de ce tuto :
    http://www.symfony-project.org/forms...-Form-Creation

    Undefined variable: request in P:\BOULOT\WEB\Twan\symfony\apps\frontend\modules\contact\actions\actions.class.php on line 36
    L'objet $request doit être passé en argument à la méthode executeXXX() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function executeThankYou(sfWebRequest $request)
    {
       [....]
    }
    S'il est inconnu, de deux choses l'une : l'appel à l'action est défectueux (hautement improbable si l'appel de fait via le framework), ou bien tu n'as pas appelé ton l'argument $request (ou alors tu ne l'as pas déclaré...)

  12. #12
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Il y a plusieurs version de ce tutoriel...

    Avoir la version réellement utilisée permettrait de cerner le problème, ou de renvoyer sur la bonne... (version !)
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Salut et désolé pour le retard.

    Alors concernant le problème il semble qu'il y ait eu méprise de ma part.
    La ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <li>Name:    <?php echo $sf_params->get(name) ?></li>
    ... ne posait en réalité pas problème !

    Je ne sais pas comment j'ai fait pour que ça ne marche pas avec, mais après qu'un pote m'ait filé un coup de main et demandé de vérifier si la ligne était vraiment obsolète, tout a très bien fonctionné.

    $sf_params n'est pas "la transformation de $params après passage via le http_build_query()" (comme j'imaginais naïvement), mais simplement une des variables Symfony qui permet d'accéder à ce qui est passé en requête. On peut donc l'utiliser même s'il n'y a pas construction manuelle d'un tableau $params.

    A un moment il y a dû avoir gourrance, anticipation négative de ma part et biais de manipulation, ou que sais-je, et soit ça a effectivement déconné soit j'ai tout inventé
    Bref, la honte quoi.

    Désolé et merci pour votre coup de main, ça me rassure de savoir qu'il y a au moins deux ou trois Symfonistes qui suivent (blagounette).

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

Discussions similaires

  1. problème avec un formulaire
    Par mary12 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 16
    Dernier message: 07/06/2006, 11h39
  2. Problème avec un formulaire
    Par GilesB dans le forum Langage
    Réponses: 9
    Dernier message: 06/06/2006, 21h19
  3. Problème avec un formulaire
    Par Mysti¢ dans le forum Langage
    Réponses: 3
    Dernier message: 02/04/2006, 00h19
  4. [Système] Problème avec les formulaires
    Par Ludo75 dans le forum Langage
    Réponses: 9
    Dernier message: 02/02/2006, 11h13
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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