Transformer un tableau PHP en tableau Javascript

VaN
Mammouth du PHP | 1107 Messages

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

ViPHP
ViPHP | 4039 Messages

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:
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

VaN
Mammouth du PHP | 1107 Messages

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

ViPHP
ViPHP | 4039 Messages

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..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

VaN
Mammouth du PHP | 1107 Messages

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.

VaN
Mammouth du PHP | 1107 Messages

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]