JeuWeb - Crée ton jeu par navigateur
[Résolu][Ajax] Transmission des variables de PHP vers Javascript - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu][Ajax] Transmission des variables de PHP vers Javascript (/showthread.php?tid=2456)

Pages : 1 2 3


RE: Transmission des variables PHP -> JS ( Ajax ) - gobes - 22-02-2008

naholyr a écrit :perso j'utilise la méthode de MaXiMa mais avec un détail supplémentaire : une fonction "php2js" maison.

1. Je crée mon résultat PHP
2. Je renvoie php2js($resultat)
3. Je fais un eval(xhr.responseText)
4. Le résultat est un objet strictement équivalent à ce que j'avais côté PHP Smile

Exemple :
Code :
// 1.
$resultat = new Objet;
$resultat->nom = 'youhou';
$resultat->data = array('abc', 'def');
$resultat->i = 24;

// 2.
echo php2js($resultat);

// 3.
var res = eval('return ' + xhr.responseText);

// 4.
alert(res.nom); // "youhou"
alert(res.data[1]); // "def"

La fonction php2js n'est pas bien méchante, quelque chose de ce genre convient parfaitement :
Code PHP :
<?php 
function php2js ($var) {
switch (
true) {

// Tableau
case is_array($var):
if (!
count($var)) {
// Tableau vide
$res = '[]';
} elseif (
array_keys($var) === range(0, count($var)-1)) {
// Tableau simple
$res = '[' . implode(',', array_map('php2js', $var)) . ']';
} else {
// Tableau associatif non vide
$res = '{';
foreach (
$var as $key => $val) {
$res .= '"' . addslashes($key) . '":' . php2js($val) . ',';
}
$res = substr($res, 0, -1) . '}';
}
return
$res;

// Booléen
case is_bool($var):
return
$var ? 'true' : 'false';

// Nombre
case is_int($var):
case
is_integer($var):
case
is_double($var):
case
is_float($var):
return
strval($var);

// Chaine de caractères
case is_string($var):
return
'"' . addslashes($var) . '"';

// Objet
case is_object($var):
$vars = get_object_vars($var);
if (!
count($vars)) {
return
'{}';
} else {
return
php2js($vars);
}

// NULL
case is_null($var):
return
'null';

// Autre ?
default:
return
php2js(strval($var));

}
}

Le lien que j'avais passé fait la même chose, à pas grand chose près ^^ mais bon, chuis pas jaloux d'autant que c'est pas un code made in moi :p


RE: Transmission des variables PHP -> JS ( Ajax ) - Roworll - 22-02-2008

Pour ma part, je fais tout dans la grande tradition AjaX avec retour des informations au format XML et parsing en JS du XML DOM.

C'est un peu plus bavard mais d'une souplesse à toute épreuve.


RE: Transmission des variables PHP -> JS ( Ajax ) - MaXimA - 22-02-2008

Roworll a écrit :Pour ma part, je fais tout dans la grande tradition AjaX avec retour des informations au format XML et parsing en JS du XML DOM.

Je ne maitrise pas très bien l'XML
vous pouvez me donnez un exemple de comment vous faites ? (ou alors un lien ^^ )


RE: Transmission des variables PHP -> JS ( Ajax ) - Roworll - 22-02-2008

En ce qui concerne XML, je n'ai malheureusement que des références en anglais

Pour la partie Ajax, j'utilise quelques scripts maison pour gérer l'objet XMLHttpRequest.
Très dépouillé, il n'offre pas toutes les possibilité d'intégration des frameworks actuels mais il me convient parfaitement.

L'idée est de renvoyer à partir du code PHP une chaine de caractère correcte au format XML.
Extrait du code de retour renvoyé par la page PHP.
Code PHP :
<?php
//Blablabla
$_xml='<id>'.$this->aTpl['teammate_id'].'</id>';
$_xml.='<name>'.$this->aTpl['name'].'</name>';
$_xml.='<gender>'.$this->aGender[$this->aTpl['gender']].'</gender>';
foreach(
$this->aCar as $Val){
$_xml.='<car id="'.$Val.'" self="'.$this->aTpl['car'][$Val]['self'].'"/>';
}
$_xml.='<salary req="'.$this->aTpl['salary']['required'].'" />';
//Blablabla
return $_xml;
?>

Le retour ressemble a quelque chose comme
Code PHP :
<?php 
<xml>
<
returncode status="0"/>
<
id>5</id>
<
name>test PNJ</name>
<
gender>M</gender>
<
car id="Str" self="12"/>
<
car id="Dex" self="8"/>
<
car id="Cst" self="15"/>
<
salary req="2560" />
</
xml>

Ensuite, dans ma fonction Javascript qui gère le retour de l'objet XMLHTTPRequest, je récupère cette chaine XML, je la transforme en XML DOM et je travaille dessus.

Code PHP :
<?php 
<script type="text/javascript">
function
returnGetCandidate(o) {
_xml=parseText(o.responseText);
if(
_xml.getElementsByTagName("returncode")[0].getAttribute('status')==-1){
// Il y a eu une erreur car le returncode est différent de 0
// Gestion de l'erreur et affichage des messages au besoin
...
} else if(
_xml.getElementsByTagName("returncode")[0].getAttribute('status')==0){
// ReturnCode a 0, tout va bien

// Je récupère la valeur de l'attribut 'req' du noeud 'salary'
var iSal=_xml.getElementsByTagName("salary")[0].getAttribute('req');
// Je récupère la valeur du noeud 'name'
var sName = _xml.getElementsByTagName("name")[0].childNodes[0].nodeValue;
// Je parcours la liste des caractéristiques (noeuds 'car')
var aCar =_xml.getElementsByTagName('car');
for(var
x=0;x<aCar.length;x++){
// Affiche le nom (id) de la caractéristique
alert(aCar[x].getAttribute('id'));
// Affiche la valeur (self) de la caractéristique
alert(aCar[x].getAttribute('self'));
}
}
}
</
script>

Pour référence, voici la fonction Javascript parseText
Code PHP :
<?php 
<script type="text/javascript">
function
parseText(s){
if (
window.ActiveXObject) {
var
doc=new ActiveXObject("Microsoft.XMLDOM");
doc.async="false";
doc.loadXML(s);
} else {
// code for Mozilla, Firefox, Opera, etc.
var parser=new DOMParser();
var
doc=parser.parseFromString(s,"text/xml");
}

return
doc.documentElement;
}
</
script>

Bon, dit comme ça, je comprends que ça puisse effrayer un peu.
Cela nécessite un peu de recherche et de technique mais au final, je trouve que c'est assez facile à utiliser. Question d'habitude sans doute.

De plus, il ne faut pas oublier que ce code est un extrait de mon système fait maison. Il ne s'appliquera certainement pas à tous les besoins mais peut donner quelques idées.


RE: Transmission des variables PHP -> JS ( Ajax ) - OncleJames - 22-02-2008

J'ai regardé la fonction php2js mais je n'arrive pas à comprendre sous quelle forme est le retour $res pour un tableau non vide.

Code PHP :
<?php 
else {
// Tableau associatif non vide
$res = '{';
foreach (
$var as $key => $val) {
$res .= '"' . addslashes($key) . '" :' . php2js($val) . ',';
}
$res = substr($res, 0, -1) . '}';
}

je reçois la chaine comme cela : { "name" : "nom1", "desc" : "desc1" }, de la comment JS l'interprète ?
Je ne peut récupérer le tableau sous la forme : $reponse['name'] par exemple

Erreur JS : Return Not in function
Code PHP :
<?php 
return { "name" : "nom1", "desc" : "desc1" }



RE: Transmission des variables PHP -> JS ( Ajax ) - naholyr - 22-02-2008

Oui en fait ce n'est pas var res = eval('return ' + valeur) mais eval('var res = ' + valeur)
No souci avec php2js Wink


RE: Transmission des variables PHP -> JS ( Ajax ) - OncleJames - 22-02-2008

Grand merci Naholyr, tout marche sans problème.

En effet la fonction php2js est très pratique, et pas trop compliqué Smile


RE: Transmission des variables PHP -> JS ( Ajax ) - rragnarok - 09-03-2008

bonjour les amis,

je ne comprend pas comment on appelle la fonction js.

je recupere la variable issue de la fonction php2js.

mais cette variable, il faut bien l'envoyer dans une fonction js pour faire l'eval... non?

comment on fait?


merci

eric


RE: Transmission des variables PHP -> JS ( Ajax ) - naholyr - 09-03-2008




RE: Transmission des variables PHP -> JS ( Ajax ) - rragnarok - 09-03-2008

yess!!

genial ce script!!!

merci mille fois!!

eric