Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1107 connectés 

  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  Récupération des données json

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Récupération des données json

n°2318085
mecano31
Posté le 17-07-2018 à 17:08:24  profilanswer
 

Bonjour à tous,
 
Je réalise un système de vote (pouce). Le vote se passe bien quand je clique sur le pouce il m'affiche (1). Le souci est que quand j'actualise ma page je n'arrive pas à récupérer le vote enregistré en base de données (pourtant c'est bien enregistré). Merci pour votre aide !
 
Un extrait du code:

Code :
  1. // html
  2. <div class="vote" id="11">
  3.     <div class="vote_btn">
  4.         <span class="btn_like"><img src="img/picto_pouce.png"></span>
  5.         <span class="votes_like">0</span>
  6.     </div>
  7. </div>


Code :
  1. // controller
  2. public function votingAction(Request $request)
  3. {
  4.     $vote_type = $request->request->get('vote');
  5.     $unique_id = $request->request->get('unique_id');
  6.     $user = $this->getUser();
  7.     $user_id = $user->getClientId();
  8.     switch ($vote_type) {
  9.         case 'like':
  10.             $vote_like = $vote_type === 'like' ? 1 : 0;
  11.             $votes = new TblVotes();
  12.             $votes->setVoteLike($vote_like);
  13.             $votes->setClient($user_id);
  14.             $votes->setResponse($unique_id);
  15.             $em->persist($votes);
  16.             $em->flush();
  17.             break;
  18.         case 'fetch':
  19.             $query = $em->getRepository(TblVotes::class)->getSumVotes($unique_id);
  20.             $vote_like = ($query["vote_like"]) ? $query["vote_like"] : (0);
  21.             $env_rep = array("vote_like" => $vote_like);
  22.             $env = new JsonResponse(json_encode($env_rep));
  23.             return $env;
  24.             break;
  25.     }
  26. }

 

Code :
  1. // js
  2. $(function(){
  3.     $.each($('.vote'), function () {
  4.         var unique_id = $(this).attr("id" );
  5.         var post_data = {'unique_id': unique_id, 'vote': 'fetch'};
  6.         var route = Routing.generate('vote');
  7.         $.post({
  8.             url: route,
  9.             data: post_data,
  10.             success: function(response) {
  11.                 console.log(response);
  12.                 $('#' + unique_id + ' .votes_like').text(response.vote_like);
  13.             },
  14.             error: function(err) {
  15.                 alert(err.statusText);
  16.             }
  17.         });
  18.     });
  19.     $('.vote .vote_btn').click(function(e) {
  20.         e.preventDefault();
  21.         var click_button = $(this).children().attr('class');
  22.         var unique_id = $(this).parent().attr("id" );
  23.         if (click_button === 'btn_like') {
  24.             var route = Routing.generate('vote_response');
  25.             var post_data = {'unique_id': unique_id, 'vote': 'like'};
  26.             $.post({
  27.                 url: route,
  28.                 data: post_data,
  29.                 success: function(response) {
  30.                     console.log(response);
  31.                     var data = $.parseJSON(response);
  32.                     var voted = data.vote_like;
  33.                     var $votes = $('#' + unique_id + ' .votes_like');
  34.                     var num = parseInt($votes.text(), 10);
  35.                     $votes.text(num + 1);
  36.                 },
  37.                 error: function(err) {
  38.                     alert(err.statusText);
  39.                 }
  40.             });
  41.         }
  42.     });
  43. });


mood
Publicité
Posté le 17-07-2018 à 17:08:24  profilanswer
 

n°2318087
dede_sav
Posté le 17-07-2018 à 19:59:50  profilanswer
 

Bonjour,
 
Le console.log(response) du post t’affiche quelque chose ?  
Tu es certains que ton code pho renvoie bien la valeur ?  
 
Dd

n°2318095
mecano31
Posté le 17-07-2018 à 23:19:07  profilanswer
 

Bonjour @dede_sav,
 
Merci d'avoir pris le temps de me répondre.
La console me renvoie bien un résultat: {'vote_like': 1}

n°2318105
mechkurt
Posté le 18-07-2018 à 09:44:59  profilanswer
 

Essaye de debugger ton selecteur ligne 12 du js en faisant un console.log du selecteur et de l'objet Jquery

Code :
  1. // js
  2.     $(function(){
  3.         $.each($('.vote'), function () {
  4.             var unique_id = $(this).attr("id" );
  5.             var post_data = {'unique_id': unique_id, 'vote': 'fetch'};
  6.             var route = Routing.generate('vote');
  7.             $.post({
  8.                 url: route,
  9.                 data: post_data,
  10.                 success: function(response) {
  11.                     console.log(response);
  12.                     console.log('#' + unique_id + ' .votes_like');
  13.                     console.log($('#' + unique_id + ' .votes_like'));
  14.                     $('#' + unique_id + ' .votes_like').text(response.vote_like);
  15.                 },
  16.                 error: function(err) {
  17.                     alert(err.statusText);
  18.                 }
  19.             });
  20.         });
  21. [...]


---------------
D3
n°2318106
mechkurt
Posté le 18-07-2018 à 09:48:43  profilanswer
 

Ah et teste aussi "response.vote_like" car on dirait un string dans ta console, pas un objet...
https://api.jquery.com/jquery.getjson/


---------------
D3
n°2318124
MaybeEijOr​Not
but someone at least
Posté le 18-07-2018 à 19:54:29  profilanswer
 

Je pense que la dernière remarque de mechkurt met le doigt sur quelque chose.
 
d'ailleurs si tu consultes la doc de Symphony : http://symfony.com/doc/current/com [...] n-response
Tu apprendras qu'il n'y a pas besoin d'encoder en Json tes données, la class JsonResponse le fait par défaut. Donc là tu encodes en Json du Json, ce qui conduit à un format erroné.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2318244
mecano31
Posté le 24-07-2018 à 14:39:05  profilanswer
 

Merci les gars pour vos réponses,
 
Si j'enlève json_encode, quand j'actualise ça m'affiche bien le vote. Mais par contre au click sur l’élément pour voter la méthode JsonResponse n'affiche pas le vote.
 

n°2318247
mechkurt
Posté le 24-07-2018 à 14:46:26  profilanswer
 

Modifie to ajax $.post pour faire un jQuery.getJSON (cf.la doc linké) ou convertit ton retour actuel en json...
Là tu as une différence entre ce que ton serveur t'envoi et ce que ton javascript s'attend à recevoir !
Un objet json reste une chaine de caractère tant qu'on ne la pas interprété :
https://developer.mozilla.org/fr/do [...] JSON/parse


---------------
D3
n°2318282
MaybeEijOr​Not
but someone at least
Posté le 24-07-2018 à 19:34:43  profilanswer
 

Moi je ne comprends pas comment tu te démerdes à chaque fois pour utiliser deux méthodes différentes pour obtenir deux résultats semblables.

 

Dans le cas du vote tu veux envoyer une requête en Ajax et écouter la réponse en Json.
Dans le cas du chargement de la page tu veux envoyer une requête Ajax et écouter la réponse en Json.

 

C'est la même chose, on est d'accord ?

 


Et pourtant du côté php tu te retrouves avec ses deux réponses :

Code :
  1. $votes->setResponse($unique_id);


Code :
  1. $env = new JsonResponse(json_encode($env_rep));
  2. return $env;
 

Et avec le code que tu fournies, on ne sait pas ce qui se cache derrière :

Code :
  1. $votes->setResponse($unique_id);


Message édité par MaybeEijOrNot le 24-07-2018 à 19:35:04

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2318283
MaybeEijOr​Not
but someone at least
Posté le 24-07-2018 à 19:40:44  profilanswer
 

D'ailleurs c'est pareil au niveau JS, un coup tu parses ta réponse :

Code :
  1. var data = $.parseJSON(response);


 
Et l'autre tu utilises directement la réponse :

Code :
  1. $('#' + unique_id + ' .votes_like').text(response.vote_like);


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
mood
Publicité
Posté le 24-07-2018 à 19:40:44  profilanswer
 

n°2318302
mecano31
Posté le 25-07-2018 à 13:30:38  profilanswer
 

Re,
 
Ce qui se cache derrière ce code :

Code :
  1. $votes->setResponse($unique_id);

c'est tout simplement qu'un vote est lié à une réponse donnée suite à une question posée par un utilisateur. Donc c'est l'id de la réponse concernée que je récupère dans ce bout de code.
 
Je récupère le vote sous forme de string et je le parse avec cette méthode : parseInt() pour convertir en entier.


Message édité par mecano31 le 25-07-2018 à 13:40:03
n°2318319
MaybeEijOr​Not
but someone at least
Posté le 25-07-2018 à 20:17:26  profilanswer
 

Le cas du "like" correspond à cette partie de JS :

Code :
  1. $('.vote .vote_btn').click(function(e) {
  2.         e.preventDefault();
  3.         var click_button = $(this).children().attr('class');
  4.         var unique_id = $(this).parent().attr("id" );
  5.         if (click_button === 'btn_like') {
  6.             var route = Routing.generate('vote_response');
  7.             var post_data = {'unique_id': unique_id, 'vote': 'like'};
  8.             $.post({
  9.                 url: route,
  10.                 data: post_data,
  11.                 success: function(response) {
  12.                     console.log(response);
  13.                     var data = $.parseJSON(response);
  14.                     var voted = data.vote_like;
  15.                     var $votes = $('#' + unique_id + ' .votes_like');
  16.                     var num = parseInt($votes.text(), 10);
  17.                     $votes.text(num + 1);
  18.                 },
  19.                 error: function(err) {
  20.                     alert(err.statusText);
  21.                 }
  22.             });
  23.         }
  24.     });


 
Dans ce cas tu effectues une requête Ajax et écoute la réponse, une fois la réponse arrivée tu la parses en supposant que c'est du Json :

Code :
  1. var data = $.parseJSON(response);


 
Mais à quel moment dans ton PHP tu envoies une réponse ? Moi je supposais que la méthode setResponse servait à ça (envoyer la réponse) :

Code :
  1. $votes->setResponse($unique_id);


Mais d'après ce que tu viens de me dire, non ça ne sert pas à envoyer la réponse.
 
Donc si tu utilises la même méthode que pour le cas du "fetch" pour envoyer une réponse, alors côté JS tu n'as pas besoin de parser la réponse car visiblement l'entête de la réponse précise que c'est du Json et que Jquery arrive à reconnaitre que c'est du Json et le parse automatiquement.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  Récupération des données json

 

Sujets relatifs
Soucis intégration date dans HTML/JSON[JS] formulaire de modification de données XML avec XPath
Récupération adresse IP de ma Passerelle en C[HTML/PHP/CSS] Diff de 2 données
Création base de données avec Entity code first[Symfony 3.3.6] Récupération de données
MariaDB Requête UPDATE JSON_SET sur une colonne NULL[Perl] Module JSON / Lire un fichier
Excel 2016 - Inscription données saisie par formulaire 
Plus de sujets relatifs à : Récupération des données json


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR