Transformer un tableau PHP en tableau Javascript

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Transformer un tableau PHP en tableau Javascript

par VaN » 25 sept. 2008, 21:47

C'est good, tout semble fonctionner au poil maintenant : )

J'aurai bien aimé pouvoir vous montrer le résultat online, mais c'est un projet professionnel pas encore en ligne, donc je vais éviter.

Merci pour vos contributions : )

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par VaN » 25 sept. 2008, 14:49

en modifiant

Code : Tout sélectionner

var pricesTest = new Array();
par

Code : Tout sélectionner

var pricesTest = new Object;
, je viens de voir que le dump n'inscrit plus la portion du fichier prototype.js. Il dump seulement le tableau. Par contre, toujours le même problème. Il existe dans la fonction loadPrice(), mais plus dans la fonction getPrice().

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

EDIT :
On dirait que prototype ajoute des méthodes au tableau pour le parcourir.. c'est original.

Ceci dit, quand et ou est-ce que tu appelles getPrice() ?

Comme tu récupères ton tableau en mode asynchrone, il est fort possible que tu appelles ta fonction avant même que le contenu ait été reçu..
Bingo !

effectivement, j'appelais getPrice() dans une fonction displayBlocks(), elle même appelé de cette manière :

Code : Tout sélectionner

<input type="radio" name="epaisseur" value="10" class="epaisseur" id="epaisseur10" onclick="getPricesFromAjaxArray(); displayBlocks();" />10 mm
J'ai toute une liste de radiobutton de ce type, qui vont me permettre de savoir quelle type de prix récupérer (lettre 10mm, 19mm, retro-eclairée, etc..)

Et effectivement, dans le onclick, j'avais placé displayBlocks() avant getPricesFromAjaxArray(). Je viens de corriger, et le dump m'affiche bien le tableau : )

Je tente de finir mon script et te tient au courant.

par Berzemus » 25 sept. 2008, 14:47

On dirait que prototype ajoute des méthodes au tableau pour le parcourir.. c'est original.

Ceci dit, quand et ou est-ce que tu appelles getPrice() ?

Comme tu récupères ton tableau en mode asynchrone, il est fort possible que tu appelles ta fonction avant même que le contenu ait été reçu..

par VaN » 25 sept. 2008, 14:05

Ohlala..

Alors voilà un alert dans la fonction loadPrices(), qui crée le tableau :
Image

En haut, on voit bien le tableau dumpé, donc il est là.

Par contre tout ce qui y'a en dessous, je viens de vérifier, c'est une partie du script prototype.js
C'est normal qu'il se trouve dans mon tableau comme ça ? Pourtant je n'ai pas du tout touché à son contenu.

Et voici un dump au niveau de la fonction getPrice(), qui doit récupérer la variable :
Image Là le tableau n'y est plus.

Je ne comprends pas pourquoi.

Code : Tout sélectionner

var pricesTest = new Array(); //Récupérer le tableau jSon par Ajax (données provenant d'un serveur PHP) function getPricesFromAjaxArray(){ // on utilise ici les supports Ajax et json du framework prototype new Ajax.Request("getPrices.php", { method:"get", onSuccess: function(response){ loadPrices (response.responseText.evalJSON()); //avec conversion de la réponse Ajax au format jSon } }); } //Afficher le tableau jSon function loadPrices(prices){ for(var i=0; i<prices.length; i++) { pricesTest[prices[i].price_range_bottomvalue] = prices[i].price_value; } alert("verification 1\n" + dump(pricesTest)); return pricesTest; } //Appel Ajax //getPricesFromAjaxArray(); function getPrice() { alert("verification 1\n" + dump(pricesTest)); }

par Berzemus » 25 sept. 2008, 13:42

Faudrait débuger un coup peu alors..

Pour faire vite, utilises une fonction "dump", qui te permettras d'afficher, en brut, le contenu de la variable.

Genre celle-ci:

Code : Tout sélectionner

function dump(arr,level) { var dumped_text = ""; if(!level) level = 0; //The padding given at the beginning of the line. var level_padding = ""; for(var j=0;j<level+1;j++) level_padding += " "; if(typeof(arr) == 'object') { //Array/Hashes/Objects for(var item in arr) { var value = arr[item]; if(typeof(value) == 'object') { //If it is an array, dumped_text += level_padding + "'" + item + "' ...\n"; dumped_text += dump(value,level+1); } else { dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n"; } } } else { //Stings/Chars/Numbers etc. dumped_text = "===>"+arr+"<===("+typeof(arr)+")"; } return dumped_text; }
(qui vient d'ici)

Ensuite, tu n'as qu'a suivre l'évolution de la variable , quand tu en as besoin

Code : Tout sélectionner

alert("vérification 1\n" + dump(priceList));
Il faudrait que tu vérifie le contenu et l'existence de ta variable aussi avant de l'utiliser, et utiliser thunderbird pour mieux comprendre ce qui se passe. On peut aussi mentionner les exceptions, mais la je crois qu'on s'avancerait un peu trop :wink:

par VaN » 25 sept. 2008, 13:12

Oui c'est ce que j'ai essayé de faire, mais depuis 1 heure je lutte :

Code : Tout sélectionner

var pricesTest = new Array(); //Récupérer le tableau jSon par Ajax (données provenant d'un serveur PHP) function getPricesFromAjaxArray(){ // on utilise ici les supports Ajax et json du framework prototype new Ajax.Request("getPrices.php", { method:"get", onSuccess: function(response){ loadPrices (response.responseText.evalJSON()); //avec conversion de la réponse Ajax au format jSon } }); } //Afficher le tableau jSon function loadPrices(prices){ for(var i=0; i<prices.length; i++) { pricesTest[prices[i].price_range_bottomvalue] = prices[i].price_value; } return pricesTest; } function getPrice() { var i = 100; while (i <= 501) { document.writeln(i + ' : ' + pricesTest[i] + ' <br />'); if(i == 100) i++; i = i + 50; } }
mon tableau est bien défini, avant la première fonction. La fonction loadPrices() le remplit, et le retourne. Et la fonction getPrice() tente de l'utiliser, mais sans succès.

La boucle de getPrice() renvoie :
100 : undefined
151 : undefined
201 : undefined
251 : undefined
301 : undefined
351 : undefined
401 : undefined
451 : undefined
501 : undefined

par Berzemus » 25 sept. 2008, 13:06

Je n'y connais vraiment rien en POO. Comment je l'enregistre dans un objet ? Et comment j'appelle cette valeur, une fois dans ma fonction de calcul ?
Ah.. alors, pour faire court (a moins de préférer la voie difficile mais Ô combien valorisante), tu peux utiliser une variable globale, que tu déclares en dehors de toute fonction (avec 'var'). Ensuite, tu pourras appeler cette variable depuis tes fonctions.

par VaN » 25 sept. 2008, 11:48

Interméde d'illustration, voici la méthode de JQuery pour récupérer du Json:

Code : Tout sélectionner

$.getJSON("./getPrices.php", function(data){ loadPrices(data); });
Cé Bô 8-)

Pour ce qui est de ton tableau, pourquoi ne pas utiliser une variable globale ? ou mieux, enregistrer ton tableau dans un objet, qui en gère alors l'accès ?

Je n'y connais vraiment rien en POO. Comment je l'enregistre dans un objet ? Et comment j'appelle cette valeur, une fois dans ma fonction de calcul ?

par Berzemus » 25 sept. 2008, 10:38

Interméde d'illustration, voici la méthode de JQuery pour récupérer du Json:

Code : Tout sélectionner

$.getJSON("./getPrices.php", function(data){ loadPrices(data); });
Cé Bô 8-)

Pour ce qui est de ton tableau, pourquoi ne pas utiliser une variable globale ? ou mieux, enregistrer ton tableau dans un objet, qui en gère alors l'accès ?

par Cyrano » 25 sept. 2008, 06:39

Mais eval est dangereux
Oui, si tu n'as pas le contrôle sur les paramètres que tu passes à cette fonction. Mais là, je suis moins certain que ce soit le cas.

Et mentionner AJAX dès le départ aurait fait avancer plus rapidement ... et sur ce point, Berzemus a raison : il faut faire un eval de la chaine reçue.

Maintenant je vous signale aussi qu'utiliser une librairie existante comme prototype, ou n'importe quelle autre, ça revient à ajouter un traitement de plus pour finalement découvrir que c'est toujours eval qui est utilisé...

par VaN » 25 sept. 2008, 02:12

Merci beaucoup pour cette aide, je commence à avancer.

En me claquant sur ton post sadeq, j'en suis arrivé là :
Mes deux fonctions JS :

Code : Tout sélectionner

//Récupérer le tableau jSon par Ajax (données provenant d'un serveur PHP) function getPricesFromAjaxArray(){ // on utilise ici les supports Ajax et json du framework prototype new Ajax.Request("getPrices.php", { method:"get", onSuccess: function(response){ loadPrices (response.responseText.evalJSON()); //avec conversion de la réponse Ajax au format jSon } }); } //Afficher le tableau jSon function loadPrices(prices){ var msg = ''; var pricesTest = new Array(); for(var i=0; i<prices.length; i++) { pricesTest[prices[i].price_range_bottomvalue] = prices[i].price_value; } document.getElementById('pricesTab').value = pricesTest; }
Mon fichier PHP :
<?php
require_once 'connexion.php';

$prices = array();

$_REQUEST['price_type'] = 10;

$sql = 	"SELECT price_range_bottomvalue, price_value FROM ".$cfg_prefixe."prices 
		WHERE price_type = '".$_REQUEST['price_type']."' ORDER BY price_range_bottomvalue";
$query = mysql_query($sql) or die(mysql_error());
while($result = mysql_fetch_assoc($query)) {
	$prices[] = array('price_range_bottomvalue'=>$result['price_range_bottomvalue'],'price_value'=>$result['price_value']) ;
}

echo json_encode($prices);

?>
Jusque là tout va bien.
Le problème est que je dois utiliser le tableau JS pricesTest généré, dans une nouvelle fonction getPrice(), qui elle va récupérer la bonne ligne du tableau, en fonction de price_range_bottomvalue, et qui va faire quelques opérations, pour enfin afficher le résultat dans un <div>.

Ne sachant pas passer une variable d'une fonction à l'autre, sans la fournir en attribut de la fonction getPrice() (getPrice() doit rester vierge d'attribut, car elle va être appelée à de multiples reprises sur des onclick de l'utilisateur), j'ai tenté de passer le tableau pricesTest dans la value d'un <input>, comme on le voit à la fin de la fonction loadPrices(prices).

Malheureusement, lorsque je tente de le récupérer dans ma fonction de calcul du prix ( getPrice() ), un

Code : Tout sélectionner

alert(typeof(document.getElementById('pricesTab').value));
me renvoie string, et je retombe sur des undefined lorsque je tente d'afficher les valeurs du tableau.

Existe t'il une solution plus simple, qui me permetttrait de passer le tableau pricesTest vers ma fonction de calcul, sans la lui fournir en attribut ?

par sadeq » 25 sept. 2008, 00:04

On peut utiliser prototype aussi qui intègre le support json et ajax.

Le principe est le suivant:
Côté PHP (version 5.2 et +) json est intégré et par défaut activé, on peut donc coder un array PHP au format json (ça c'est déjà fait) ok:
Voici donc l'exemple du serveur de notre tableau json. On l'appellera : jSonPricesArray.php
<?php 
$prices = array(
	array('price_range_bottomvalue'=>100, 'price_value'=>10),
	array('price_range_bottomvalue'=>151, 'price_value'=>14),
	array('price_range_bottomvalue'=>201, 'price_value'=>18),
);
echo json_encode($prices); 
?>
Côté HTML, on a besoin du support Ajax pour appeler le service : jSonPricesArray.php et du support jSon pour mettre en forme le résultat retourné à Ajax.
Pour celà, on va utiliser le framework prototype (dernière version stable) ainsi pour démarrer un appel Ajax on va utiliser la fonction suivante:

Code : Tout sélectionner

function getPricesFromAjaxArray() { // on utilise ici les supports Ajax et json du framework prototype new Ajax.Request("jSonPricesArray.php", { method:"get", onSuccess: function(response){ showPrices (response.responseText.evalJSON()); //avec conversion de la réponse Ajax au format jSon } }); }
L'événement onSuccess se déclenche quand Ajax reçoit la réponse du service appelé. Réponse représentée par le paramètre "response".
La fonction attachée à l'événement onSuccess appelle, en fait, une autre fonction qu'on va écrire en lui passant comme paramètre la réponse Ajax (propriété "responseText") sans oublier de la formater au format jSon par la méthode "evalJSON()" de prototype.

La fonction showPrices(untableau) attend en entrée un tableau au format objet json de javascript qu'elle va parcourir de 0 à N (length du tableau) et afficher ses cases une par une. Voici comment:

Code : Tout sélectionner

function showPrices(prices) { var msg = ''; for(var i=0; i<prices.length; i++) { msg += ' - Prix bas : '+ prices[i].price_range_bottomvalue +'; Prix : '+ prices[i].price_value +'\n'; } alert(msg); }
Et voilà, c'est fini.

Pour démarrer le processus, il faut appeler en premier la fonction Ajax: getPricesFromAjaxArray()

Voici le récap du code HTML général:

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <title>Échanges JSON PHP/JavaScript</title> <script type="text/javascript" src="prototype-1.6.0.2.js"></script> <script type="text/javascript"> //Récupérer le tableau jSon par Ajax (données provenant d'un serveur PHP) function getPricesFromAjaxArray() { // on utilise ici les supports Ajax et json du framework prototype new Ajax.Request("jSonPricesArray.php", { method:"get", onSuccess: function(response){ showPrices (response.responseText.evalJSON()); //avec conversion de la réponse Ajax au format jSon } }); } //Afficher le tableau jSon function showPrices(prices) { var msg = ''; for(var i=0; i<prices.length; i++) { msg += ' - Prix bas : '+ prices[i].price_range_bottomvalue +'; Prix : '+ prices[i].price_value +'\n'; } alert(msg); } //Appel Ajax getPricesFromAjaxArray(); </script> </head> <body> </body> </html>

par Berzemus » 24 sept. 2008, 23:28

Hum, un détail je crois, mais le contenu retourna par ta fonction XHR est peut-être du simple texte.. Et donc, pour que ça fonctionne, il faut que JS l'interprète..

Genre:

Code : Tout sélectionner

var monBoObjet = eval('(' + texteJson + ')');
Mais eval est dangereux, et pour ne pas se tuer en protections, des objets tout faits existent:
http://www.json.org/json2.js

J'oubliais de le préciser, comme Jquery l'interprète tout seul comme un grand.. 8-) .

source: json.org

par Cyrano » 24 sept. 2008, 22:17

La source HTML de ta page générée ressemble à quoi au juste ?

par VaN » 24 sept. 2008, 21:09

Image

:oops:

C'est à peu près la même chose que j'ai réussi à faire lors de mes bidouillages avant de poster, du "undefined" sur tout ce que je testais : /

Je comprend un peu le principe de ton script. Saurais-tu d'où peut venir ce undefined ?

EDIT : en fait ton script marche bien. Mais il semblerait que ça soit ce que je récupère de la fonction AJAX qui ne soit pas bon.

Pourtant, lorsque je browse mon fichier php, voilà ce qu'il renvoie :
[{"price_range_bottomvalue":"100","price_value":"10"},{"price_range_bottomvalue":"151","price_value":"14"},{"price_range_bottomvalue":"201","price_value":"18"},{"price_range_bottomvalue":"251","price_value":"22"},{"price_range_bottomvalue":"301","price_value":"26"},{"price_range_bottomvalue":"351","price_value":"30"},{"price_range_bottomvalue":"401","price_value":"34"},{"price_range_bottomvalue":"451","price_value":"38"}]
c'est à dire la même chose que ta variable JSONfile.

D'où vient mon erreur ?

Code : Tout sélectionner

var JSONfile = creerXHR('getPrices.php?price_type='+ type); var msg = ''; for(var i in JSONfile){ msg += ' - Prix bas : '+ JSONfile[i].price_range_bottomvalue +'; Prix : '+ JSONfile[i].price_value +'\n'; } alert(msg);
$prices = array();

$sql = 	"SELECT price_range_bottomvalue, price_value FROM ".$cfg_prefixe."prices 
		WHERE price_type = '".$_REQUEST['price_type']."' ORDER BY price_range_bottomvalue";
$query = mysql_query($sql) or die(mysql_error());
while($result = mysql_fetch_assoc($query)) {
	$prices[] = $result;
}
echo json_encode($prices);