Partage
  • Partager sur Facebook
  • Partager sur Twitter

jQuery Flot

Sujet résolu
    29 avril 2009 à 11:16:00

    Bonjour,

    Je commence à utiliser le plugin Flot (pour faire des graphiques) de la librairie jQuery, mais je rencontre un problème.

    Voici mon script javascript :
    <script id="source" language="javascript" type="text/javascript">
    		$(function () {
    			var annee = 2009;
    			var donnees = new Array();
    			$.ajax({
    				async: false, 
    				type: "post",url: "./_ajax/statistique.php",
    				data: "annee="+annee,
    				success: function(html){ 
    					donnees = [html];
    				}
    				
    			}); 
    
    			$.plot($("#placeholder"),
    				[ { 
    					data: donnees,
    					lines: { show: true, fill: true },
    					points: { show: true }
    				} ],
    				{ 
    					xaxis: { mode: "time" },
    					legend: { position: "sw" } 
    				});
    
    
    		});
    		</script>
    


    Et mon script ajax pour le traitement des données :


    <?php
    for($i = 1; $i <=12; $i++)
    {
    	$nb = Mysql::get_info('test', 'COUNT(id) as nb', 'MONTH(date)', $i);
    	$mois = mktime(0, 0, 0, $i, 1, $annee).'000';
    	
    	echo '['.$mois.','.$nb[nb].']';
    	
    	if($i != 12)
    	{
    		echo ',';
    	}
    
    }
    ?>
    


    Donc l'ajax me retourne ceci :

    [1230764400000,186],[1233442800000,168],[1235862000000,186],[1238536800000,140],[1241128800000,0],[1243807200000
    ,0],[1246399200000,0],[1249077600000,0],[1251756000000,6],[1254348000000,81],[1257030000000,160],[1259622000000
    ,186]

    Cependant, Javascript n'aime pas. Il détecte bien que ce n'est pas un tableau javascript apparemment et ca pose problème.

    J'ai donc essayé de faire comme ceci :

    <?php
    for($i = 1; $i <=12; $i++)
    {
    	$nb = Mysql::get_info('test', 'COUNT(id) as nb', 'MONTH(date)', $i);
    	$mois = mktime(0, 0, 0, $i, 1, $annee).'000';
    	
    	echo $mois.','.$nb[nb];
    	
    	if($i != 12)
    	{
    		echo ';';
    	}
    
    }
    ?>
    


    Et ensuite de spliter la chaine pour l'avoir sous forme de tableau. Mais pareil, ça ne fonctionne pas :S

    Et quand j'écris directement la chaine manuellement dans la variable donnees, ça fonctionne.

    Comment faire ?

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      29 avril 2009 à 11:33:54

      Pour que ce soit un tableau à deux dimensions, il faudrait que ce soit sous la forme :

      [[1230764400000,186],[1233442800000,168],[1235862000000,186],[1238536800000,140],[1241128800000,0],[1243807200000
      ,0],[1246399200000,0],[1249077600000,0],[1251756000000,6],[1254348000000,81],[1257030000000,160],[1259622000000
      ,186]]
      


      Mais même ainsi, il faudrait sans doute passer par eval pour obtenir un tableau JS, donc je n'est pas la meilleure solution qui soit.

      Renseigne-toi sur le format JSON, qu'il est possible de transmettre assez facilement de PHP à JS je crois.
      • Partager sur Facebook
      • Partager sur Twitter
        29 avril 2009 à 11:37:38

        Oui pour le tableau à 2 dimensions.

        N'est-il pas possible avec des regex et des split de lui dire de découper la chaîne pour obtenir un tableau ?
        • Partager sur Facebook
        • Partager sur Twitter
          29 avril 2009 à 11:46:22

          Si, surement, mais c'est moins bien optimisé que le JSON je pense...


          Tu pourrais parser avec un truc comme ça :

          var str = "[1230764400000,186],[1233442800000,168],[1235862000000,186],[1238536800000,140],[1241128800000,0],[1243807200000,0],[1246399200000,0],[1249077600000,0],[1251756000000,6],[1254348000000,81],[1257030000000,160],[1259622000000,186]";
          var reg = /[0-9]+/g;
          var tab = str.match(reg);
          var tab_final = [];
          for(var i=0,l=tab.length;i<l;i+=2) {
            tab_final.push([tab[i],tab[i+1]]);
          }
          return tab_final;
          


          (En supposant que les valeurs aillent toujours deux par deux...)
          • Partager sur Facebook
          • Partager sur Twitter
            29 avril 2009 à 11:58:54

            Oui les données sont toujours par deux.

            Quand je fais dans la boucle :
            alert(tab[i]+" - "+tab[i+1]);
            


            J'ai bien mes 2 valeurs qui sont séparées à chaque fois.

            Mais, quand je fais un alert(donnees), c'est vide.

            Et il faut que je déclare donnees avant de cette manière :
            var donnees = new Array();
            


            ?

            Merci

            Un récapitulatif de ce que j'ai :

            <?php
            echo '[';
            
            for($i = 1; $i <=12; $i++)
            {
            	$nb = Mysql::get_info('pointage', 'COUNT(id) as nb', 'MONTH(date)', $i);
            	$mois = mktime(0, 0, 0, $i, 1, $annee).'000';
            	
            	echo '['.$mois.','.$nb[nb].']';
            	
            	if($i != 12)
            	{
            		echo ',';
            	}
            
            }
            
            echo ']';
            ?>
            

            $(function () {
            			var annee = 2009;
            			var donnees = new Array();
            			$.ajax({
            				async: false, 
            				type: "post",url: "./_ajax/statistique.php",
            				data: "annee="+annee,
            				success: function(html){ 
            					var str = html;
            					var reg = /[0-9]+/g;
            					var tab = str.match(reg);
            					var donnees = [];
            					for(var i=0,l=tab.length;i<l;i+=2) {
            						alert(tab[i]+" - "+tab[i+1]);
            					  donnees.push([tab[i],tab[i+1]]);
            					}
            
            				}
            				
            			}); 
            			
            			$.plot($("#placeholder"),
            				[ { 
            					data: donnees,
            					lines: { show: true, fill: true },
            					points: { show: true }
            				} ],
            				{ 
            					xaxis: { mode: "time" },
            					legend: { position: "sw" } 
            				});
            
            
            		});
            
            • Partager sur Facebook
            • Partager sur Twitter
              29 avril 2009 à 12:01:22

              C'est quoi "donnees" ? Dans le code que j'ai mis, le résultat se trouve dans tab_final[]... qui est un tableau à deux dimensions...
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                29 avril 2009 à 12:07:57

                Enlève l'attribut langage de ta balise <script>

                $(function () {
                	var annee = 2009;
                	var donnees = new Array();
                	$.ajax({
                		async: false, 
                		type: "post",url: "./_ajax/statistique.php",
                		data: "annee="+annee,
                		success: function(html){ 
                			donnees = [html];
                			$.plot($("#placeholder"),
                				[ { 
                					data: donnees,
                					lines: { show: true, fill: true },
                					points: { show: true }
                				} ], { 
                					xaxis: { mode: "time" },
                					legend: { position: "sw" } 
                			});
                		}
                	});	
                });
                


                Y'a des chances que ça marche mieux. donnes ne sera pas vide au moins.
                • Partager sur Facebook
                • Partager sur Twitter
                  29 avril 2009 à 12:10:02

                  ? Cette méthode la je l'ai essayé en premier, ca ne fonctionne pas. Il ne considère pas html comme un tableau mais une chaine.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    29 avril 2009 à 12:13:14

                    na mais tu fais le traitement de donné de golmote, tu passes ton truc en JSON (mieux) c'est pas le sujet dans ce bout de code.

                    Là tu execute la fonction une fois que tu as quelquechose dans "donnees". Dans ton premier code :
                    - tu déclare donnees qui est vide
                    - tu execute ta requete ajax
                    - tu attends pas qu'elle soit revenue et tu utilise directement donnees

                    Or à ce moment là, la requete n'est pas revenue, donnees est vide.

                    En foutant $.plot dans success tu va pouvoir tripatouiller "donnees" dans laquelle il y aura effectivement quelque chose à tripatouiller.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 avril 2009 à 12:13:47

                      Une petite info pour toi squalleric.

                      var donnees = new Array();
                      /* Est équivalent à */
                      var donnees = [];
                      


                      :p
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 avril 2009 à 12:15:38

                        Autant pour moi,

                        J'ai enlevé la ligne var donnees = [];

                        Et ça fonctionne :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 avril 2009 à 13:07:13

                          Super, alors mets le sujet en résolu ;)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          jQuery Flot

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown