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 :

Récupérer des données envoyées en AJAX dans le controller [4.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut Récupérer des données envoyées en AJAX dans le controller
    Bonjour la communauté,

    Depuis ma homepage, je tente de faire une simple requête AJAX afin de passer en variables de session Php la latitude et la longitude éventuellement récupérées par la géolocalisation réalisée par le navigateur. Ces données se retrouvent bien dans le formulaire de ma homepage car, sur le retour de ma requête AJAX, lorsque je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                success: function(response) {
     
                                              console.log(response);
                                              alert('latitude = '  + $('#latitude').val() + ' and longitude = ' + $('#longitude').val());
     
                                            }
    j'ai bien le popup

    Nom : Capture.JPG
Affichages : 2651
Taille : 14,4 Ko

    Par contre, la récupération de ces données par mon controller ne s'effectue pas correctement.

    Voici ma réquête AJAX :

    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
     
      $.post({
     
                url: $('#ajaxRoute').val(),
                data: {
     
                        latitude: $('#latitude').val(),
                        longitude: $('#longitude').val()
     
                      },
                dataType: "json",
                success: function(response) {
     
                                              console.log(response);
                                              alert('latitude = '  + $('#latitude').val() + ' and longitude = ' + $('#longitude').val());
     
                                            }
     
      });
    Et ma fonction dans le 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
     
        /** 
         * @Route("/user/geolocation/session", name="user.geolocation.session") 
         */ 
        public function ajaxAction(Request $request) 
        {  
     
            if($request->isXmlHttpRequest())
            {
                $latitude = $request->request->get('latitude');
                $longitude = $request->request->get('longitude'); 
     
                $this->container->get('session')->set('latitude', $latitude);
                $this->container->get('session')->set('longitude', $longitude);
     
                $response = new JsonResponse();
                $response->setData(array('latitude'=> $request->request->get('latitude'), 'longitude'=> $request->request->get('longitude'))); 
     
                return $response;
            }
            else
            {
     
                $response = new JsonResponse();
                $response->setData(array('error'=> 'error'));
                return $response;
     
            }
     
        }
    La réponse Json me donne ce résultat :

    Nom : Capture.JPG
Affichages : 2617
Taille : 11,5 Ko

    Apparemment,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $request->request->get()
    n'a pas l'air de fonctionner comme je l'entends.

    Quelqu'un aurait une idée?

    Merci d'avance pour votre aide.

    EDIT : je remarque que les contrôles "latitude" et "longitude" sont vides au moment du premier appel AJAX. Si je fais un refresh de la page, je récupère alors correctement le tout.
    Images attachées Images attachées  

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    bonjour,

    en Symfony 4 tu ne plus plus faire $this->container->get('machin') car tous les services sont privés. Pour acceder à un service, tu passes ce service soit en paramètre de la méthode soit en paramètre du constructeur. Pour le cas de la session il suffit d'injecter l'interface SessionInterface pour créer une session(
    https://symfony.com/doc/current/session.html).

    Après pour tester la requête ajax autant commencer par le strict minimum voir si les données envoyées en js sont bien reçues:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     /** 
         * @Route("/user/geolocation/session", name="user.geolocation.session") 
         */ 
        public function ajaxAction(Request $request) 
        {  
                return $this->json( $request->request->all());
     
        }
    l'action de ton controlleur ne traite que la requête ajax donc cette ligne if($request->isXmlHttpRequest()) devient inutile.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Merci beaucoup pour ton aide.

    J'ai modifié l'ordre de mes conditions dans mon js, j'ai mis un trigger au changement de la valeur de la latitude et j'ai mis un condition onchange sur l'appel AJAX :

    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
     
    jQuery( document ).ready( function( $ ) {
     
      var userAddress = sessionStorage.getItem("userAddress");
     
      if(navigator.geolocation)
      {
     
        if (userAddress === null) 
        {  
     
          navigator.geolocation.getCurrentPosition(function(position) {
     
              var latitude = position.coords.latitude;
              var longitude = position.coords.longitude;
     
              $('#latitude').val(latitude);
              $('#longitude').val(longitude);
              $("#longitude").trigger('change');
              sessionStorage.setItem('userLatitude', latitude);
              sessionStorage.setItem('userLongitude', longitude);
     
              var address = geocode(position.coords.latitude + ', ' + position.coords.longitude);
     
              $('#search_address').val(address);
              sessionStorage.setItem('userAddress', address);
     
     
            });
     
        }
        else
        {
     
          $('#latitude').val(sessionStorage.getItem("userLatitude"));
          $('#longitude').val(sessionStorage.getItem("userLongitude"));
          $('#search_address').val(sessionStorage.getItem("userAddress"));
     
        }  
     
      }
     
      $("#longitude").change(function() {
     
        $.post({
     
                  url: $('#ajaxRoute').val(),
                  data: {
     
                          latitude: $('#latitude').val(),
                          longitude: $('#longitude').val()
     
                        },
                  dataType: "json",
                  success: function(data) {
     
                                                console.log(data);
     
                                          }
     
        });
     
      });
     
    });
    Cela a résolu mon problème.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/09/2018, 12h47
  2. [1.x] Récupérer des données d'une bdd dans une liste déroulante
    Par bMallo dans le forum Symfony
    Réponses: 4
    Dernier message: 02/08/2012, 10h48
  3. Réponses: 3
    Dernier message: 18/07/2012, 23h44
  4. Récupérer des données d'une feuille dans une autre
    Par pedroo dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/02/2009, 16h58
  5. Réponses: 3
    Dernier message: 01/09/2008, 13h46

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