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 :

Formulaire n'utilisant pas la méthode POST [2.x]


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Formulaire n'utilisant pas la méthode POST
    Bonjour à tous,

    J'ai un problème très bizarre. J'ai créé un formulaire, mais le problème est que dans mon Action Controller lorsque je teste ma requete si elle est bien du type POST, je n'entre jamais dans la boucle, car ça reste en GET.

    Je veux créer un moteur de recherche visible sur toutes mes pages.


    1. Ajout de mon formulaire a mon layout principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {% render "SearchBundle:Default:request" %}
    2. Mon objet searchRequest qui sera envoyé au formulaire
    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
     
    namespace KassApp\PublicBundles\SearchBundle\Entity;
     
    class SearchRequest {
     
            private $request;
     
            public function getRequest() {
                    return $this->request;
            }
     
            public function setRequest($request) {
                    $this->request = $request;
            }
    }
    3. requestAction() du Controller de mon bundle
    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
     
    public function requestAction() {
     
                    $searchRequest = new SearchRequest();
     
                    $formbuilder = $this->createFormBuilder($searchRequest);
                    $formbuilder->add('request', 'text'); // request est ici le nom du champs de l'objet SearchRequest
                    $form = $formbuilder->getForm();
     
                    $request = $this->get('request');
     
                     if($request->getMethod() == 'POST') {
     
                            $form->bindRequest($request);
     
                            if($form->isValid()) {
                                    // Effectuer les recherches dans la BDD
                            }
     
                     }
     
                    return $this->render('SearchBundle:Default:searchform.html.twig',
                                            array( 'form' => $form->createView(), ));
     
            }
    4. le fichier searchform.html.twig qui affiche le formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <form action="{{ path('SearchBundle_results') }}" method='POST' {{ form_enctype(form) }}>
            {{ form_label(form.request, "Rechercher") }}
            {{ form_errors(form.request) }}
            {{ form_widget(form.request) }}
     
                    {{ form_rest(form) }}
            <input type="submit" />
    </form>


    Dans la methode request action après la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $request = $this->get('request');
    J'ai fais un affichage du résultat, et voici ce que cela me retourne après avoir entré "voiture" dans mon formulaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GET /MonApp/web/app_dev.php/searchresults HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Connection: keep-alive Content-Length: 83 Content-Type: application/x-www-form-urlencoded Cookie: __utma=111872281.1338910243.1341915209.1342830953.1343866004.4; __utmz=111872281.1341915209.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=344c2e593b0daee579a9faf488b59228 Host: localhost:8888 Referer: http://localhost:8888/MonApp/web/app_dev.php/searchresults User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0 X-Php-Ob-Level: 1 form%5Brequest%5D=voiture&form%5B_token%5D=c6ad825b124baf5a4d817e2eb16410a31e0cfde6
    A aucun moment je n'entre dans le if ($request->getMethod()=='POST') de ma methode requestAction().

    J'espère que quelqu'un pourra m'aider car là je n'y arrive plus...
    Merci!

  2. #2
    Membre habitué Avatar de Avrel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 118
    Points : 177
    Points
    177
    Par défaut
    Essaye de mettre des doubles quote dans ta balise forme
    Je dis peut être des conneries mais pour les attributs HTML il me semble que ca marche pas avec des simples quotes.

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci Avrel pour ta réponse, mais malheureusement ça ne marche toujours pas.
    Pourtant quand on regarde la requête ça a l'air de pas trop mal passer, car si pour tester je met dans mon formulaire par exemple method="GET", la requeste sera bien diff.

    1. Recherche du mot "VOITURE" avec methode="GET"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GET /MonApp/web/app_dev.php/searchresults?form%5Brequest%5D=VOITURE&form%5B_token%5D=c6ad825b124baf5a4d817e2eb16410a31e0cfde6 HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Connection: keep-alive Cookie: __utma=111872281.1338910243.1341915209.1342830953.1343866004.4; __utmz=111872281.1341915209.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=344c2e593b0daee579a9faf488b59228 Host: localhost:8888 Referer: http://localhost:8888/MonApp/web/app_dev.php/home User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0 X-Php-Ob-Level: 1

    2. Recherche du mot "VOITURE" avec methode="POST"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GET /MonApp/web/app_dev.php/searchresults HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Connection: keep-alive Content-Length: 83 Content-Type: application/x-www-form-urlencoded Cookie: __utma=111872281.1338910243.1341915209.1342830953.1343866004.4; __utmz=111872281.1341915209.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=344c2e593b0daee579a9faf488b59228 Host: localhost:8888 Referer: http://localhost:8888/MonApp/web/app_dev.php/searchresults User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0 X-Php-Ob-Level: 1 form%5Brequest%5D=VOITURE&form%5B_token%5D=c6ad825b124baf5a4d817e2eb16410a31e0cfde6

  4. #4
    Membre habitué Avatar de Avrel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 118
    Points : 177
    Points
    177
    Par défaut
    Et en modifiant
    par
    Dans ton controlleur ?

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Malheureusement non plus...
    C'est vraiment incompréhensible! Partout ou je regarde la syntaxe est comme la mienne. Le pire c'est que la valeur du formulaire je la reçois, mais la methode reste en GET.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    ou alors dans la route de l'entité correspondante en YAML
    //Resources/routing/entity.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    taRoute_xxx:
        pattern:  /xxxxx
        defaults: { _controller: "XxXxxBundle:xxxxxx:xxxxxx" }
        requirements:
            _method: POST|GET
    //Resources/routing.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tonBundle_entity:
        resource: "routing/entity.yml"
        prefix: /taRoute

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Salut aitiahcene,

    j'ai essayé de rajouter ça dans la route de la page d'affichage des résultats mais ça ne marche toujours pas.

    Par contre pour tester j'ai essayé de mettre simplement _method: POST.
    En remplissant puis validant le formulaire on accède bien a la page, par contre en entrant le lien direct on est bloqué. Ceci montre que les données passent bien par la méthode post, d'ailleurs ça se voit bien dans les détails de la requête, mais cette dernière est considérée comme était toujours de forme GET.

    Ca fait depuis ce matin que je suis dessus, je commence à baisser les bras

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    Bah c'est normal c'est comme les actions new create de CRUD chaque une a sa route !! , je peux voir ton path "SearchBundle_results" ??

    Pour savoir les GET ou les POST des routes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php app/console router:debug

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je n'ai pas la même structure de fichiers que toi. J'ai juste le fichier Resources/config/routing.yml qui est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SearchBundle_results:
        pattern:  /searchresults
        defaults: { _controller: SearchBundle:Default:index }
        requirements:
            _method: POST|GET

  10. #10
    Membre habitué Avatar de Avrel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 118
    Points : 177
    Points
    177
    Par défaut
    ha bah c'est tout con alors,

    Ta route renvoi vers la méthode index de ton controller Default.

    Hors tu essaye de l'utiliser dans la methode request que tu nous a montré.

    Il faut simplement que tu modifie la route pour que le formulaire arrive dans la bonne méthode.

  11. #11
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    mmmmhhhh ok !!!
    merci énormément car ça marche là.

    Enfin pas à 100%. J'ai donc créé mon formulaire que sera affiché dans mon layout principal, car logiquement je veux qu'on puisse rechercher depuis n'importe quelle page. Les résultats quant à eux, seront affichés sur la page /searchresults.

    C'est pour ça que pour afficher le formulaire j'avais ajouté ceci a mon layout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {% render "SearchBundle:Default:request" %}
    et donc l'action du formualaire je l'avais redirigé vers la route de /searchresults. C'est pour ca que pour cette route j'appellais une autre action.
    Donc pour l'instant avec le changement que j'ai fais dans ma route, la requête est bien envoyée en POST, mais le truc c'est que cq me redirige vers le template twig de mon formulaire, et non vers ma page de résultats.


    Comment doi-je faire maintenant? Dois-je dans mon action après if($request->getMethod() == 'POST') effectuer mes requêtes puis ensuite rediriger sur ma page /searchresults?

  12. #12
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    C'est bon je croi avoir trouvé.

    J'ai ajouté ça après mon if:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return $this->render('SearchBundle:Default:searchresults.html.twig');

    Merci beaucoup pour votre aide !!

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

Discussions similaires

  1. forcer l'utilisation de la méthode POST <h:form..
    Par ii.abbassi dans le forum JSF
    Réponses: 18
    Dernier message: 17/08/2010, 16h59
  2. [MVC] Formulaire ne passant pas la méthode onSubmit
    Par la_praline dans le forum Spring Web
    Réponses: 1
    Dernier message: 04/08/2010, 16h40
  3. Plusieurs formulaires dans un fichier avec plusieurs méthodes post
    Par cyberdevelopment dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2006, 15h04
  4. Réponses: 1
    Dernier message: 15/05/2006, 18h05
  5. Formulaire utilisant la méthode POST + popup
    Par Hell dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 27/10/2004, 13h34

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