Récupération des données json

Récupération des données json - Javascript/Node.js - Programmation

Marsh Posté le 17-07-2018 à 17:08:24    

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. });


Reply

Marsh Posté le 17-07-2018 à 17:08:24   

Reply

Marsh Posté le 17-07-2018 à 19:59:50    

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

Reply

Marsh Posté le 17-07-2018 à 23:19:07    

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

Reply

Marsh Posté le 18-07-2018 à 09:44:59    

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
Reply

Marsh Posté le 18-07-2018 à 09:48:43    

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
Reply

Marsh Posté le 18-07-2018 à 19:54:29    

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.
Reply

Marsh Posté le 24-07-2018 à 14:39:05    

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.
 

Reply

Marsh Posté le 24-07-2018 à 14:46:26    

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
Reply

Marsh Posté le 24-07-2018 à 19:34:43    

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.
Reply

Marsh Posté le 24-07-2018 à 19:40:44    

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.
Reply

Marsh Posté le 24-07-2018 à 19:40:44   

Reply

Marsh Posté le 25-07-2018 à 13:30:38    

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
Reply

Marsh Posté le 25-07-2018 à 20:17:26    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed