cs_YASSINE1982
Messages postés6Date d'inscriptionmercredi 7 juillet 2004StatutMembreDernière intervention16 mars 2007
-
14 mars 2007 à 13:32
cs_YASSINE1982
Messages postés6Date d'inscriptionmercredi 7 juillet 2004StatutMembreDernière intervention16 mars 2007
-
16 mars 2007 à 19:48
J’ai essayé de modifier un tout petit peu laa fonction de malalam : http://www.phpcs.com/code.aspx?ID=32108 en fixant la
variable page en une constante ‘functions.php’ j’a déterminer la
méthode comme POST, mais j’ai ajouter un paramètre ‘MyFunction’. Le but
de ca c’est de pouvoir faire appel à une fonction PHP bien déterminée,
en déterminant la place où on veut afficher ses résultats.
Finalement
avec ça notre site va se composer de 3 fichiers : index.html ;
functions.php (qui contient tous les fonctions PHP) ; un fichier
script.js qui contient le actions script entre outre Ta fonction
SendData.
Ça marché très bien, mais par la suite j’ai essayé de
voir plus loin, c’est de développer une Fonction SendMultiData dont le
nombre de paramètres est indéterminé qui permet d’envoyer de 1 à
plusieurs requêtes au même temps et de recevoir les résultats et de les
placer successivement dans des différents places :
SendMultiData(param1,Place1,Function1, param2,Place2,Function2…)
Ce que j’ai fait c’est exécuter SendData Plusieurs fois avec des paramètres différents.
<script type="text/javascript">
/**
* Permet d'envoyer des données en GET ou POST en utilisant les XmlHttpRequest
*/
function sendData(param,place,myfunction)
{
myparam= param+'&myfunction='+myfunction;
page = 'function.php';
if(document.all)
{
//Internet Explorer
var XhrObj = new ActiveXObject("Microsoft.XMLHTTP") ;
}//fin if
else
{
//Mozilla
var XhrObj = new XMLHttpRequest();
}//fin else
//définition de l'endroit d'affichage:
var content = document.getElementById(place);
XhrObj.open("POST", page);
//Ok pour la page cible
XhrObj.onreadystatechange = function()
{if (XhrObj.readyState 4 && XhrObj.status 200)
content.innerHTML = XhrObj.responseText ;
}
XhrObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
XhrObj.send(myparam);
param=null;
}//fin fonction SendData
function sendMultiData()
{
for (var i=0; i < sendMultiData.arguments.length; i=i+3)
{
para = sendMultiData.arguments[i] ;
placy = sendMultiData.arguments[i+1] ;
fction = sendMultiData.arguments[i+2] ;
sendData(para,placy,fction);
}
}
</script>
Le
problème que ça par marché parce que, tout simplement, JavaScript
continue l’exécution sans attendre la réponse du serveur qui sera
traitée quand elle arrivera, d’où le nom ‘Asychronous’
Quelqu’un peut trouver une solution ?
A
mon avis la boucle il faut que ca soit coté serveur comme ca le fichier
php s’execute une seule fois, il faut peut être envoyer un tableau de
données au serveur (param1,Place1,Function1, param2,Place2,Function2…)
J_G
Messages postés1406Date d'inscriptionmercredi 17 août 2005StatutMembreDernière intervention28 août 200710 14 mars 2007 à 14:10
Salut,
j'avais essayé de faire ça, mais ça marchait pas top...
Ce que j'avais fait, une pile de requètes :
stack = Array();
SendMultiData aurait pour effet de pousser dans stack :
stack.push([param, place, func]); // là j'ajoute un autre tableau...
puis appelle une fonction de dépilage :
function unstack() {
if ( stack.length ) {
var elt = stack.pop();
sendData(elt[0], elt[1], elt[2]);
}
}
Et, dans la fonction qui est executée lorsque status == 'OK' (me souviens plus du code), tu rappelles unstack !!!
Par contre, je ne me souvient plus vraiment pourquoi ca plantait ... Un truc genre "certaines requètes plus rapides répondent avant d'autres... le bug!"
Flachy Joe
Messages postés2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 20231 14 mars 2007 à 20:03
>>>Un truc genre "certaines requètes plus rapides répondent avant d'autres... le bug!"
Il suffit d'ajouter un parametre indiquant à la fonction le temps minimum au bout duquel elle doit répondre. A la fin de la fonction, tu fait une boucle pour attendre que ce temps soit écoulé.
cs_YASSINE1982
Messages postés6Date d'inscriptionmercredi 7 juillet 2004StatutMembreDernière intervention16 mars 2007 15 mars 2007 à 12:29
le problème avec timeout ou la boucle c'est que c'est pas une solution 100% logique, car on peut pas prévoir le temps que la reuquête vas prendre pour donner sa réponse.
>>> ça dépand de la connexion et d'autres facteurs, pour moi c'est pas une solution professionelle...
mais j'ai ponsser à autre chose c'est de développer une boucle coté serveur 'en PHP' qui exécute l'ensemble des fonction et envois les résultats des différents fonctions sous forme d'un tableau : [Place1,Résultat_Fonction1,Place1,Résultat_Fonction1...]
coté client une autre boucle en javascript place les résultats de la fonction1 dans la place1, de la fonction2 à la place2...
j'ai déjà commencer ce procesus, ça donne déjà des bonnes indices...
Flachy Joe
Messages postés2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 20231 15 mars 2007 à 19:54
Pour l'attente, c'était en PHP que je pensai la faire : le javascript ne bloque pas et le temps ne dépend pas de la connexion, uniquement du serveur. Mais bon si il y plus logique et professionel...
>>>tu peux aussi assigner un id à ta requete et du coup tu peux recuperer l endroit ou stocker le resultat non??
Tu pourait aussi envoyer l'endroit où stocker le resultat à la fonction PHP, qui te le renverrai avec ses autres résultats, comme ça pas d'histoire de tableau en JS et on a juste à traiter les resultats, pas les appels.
J'ai remarqué un truc aussi : avec FF tu faire plusieurs appel de Send à la suite avec le même objet XMLHttpRequest, par contre avec IE (6 tout du moins) ça marche pas et il faut refaire un nouvel objet pour chaque requete. J'imagine que refaire des objets à chaque fois, ça prend du temps et des ressources, donc si t'as plein de requetes à envoyer, ça peut être bien pour les FFiens d'utiliser un objet global.
cs_YASSINE1982
Messages postés6Date d'inscriptionmercredi 7 juillet 2004StatutMembreDernière intervention16 mars 2007 15 mars 2007 à 20:38
j'ai pas bien compris Flachy :
"Tu pourait aussi envoyer l'endroit où stocker le resultat à la fonction
PHP, qui te le renverrai avec ses autres résultats, comme ça pas
d'histoire de tableau en JS et on a juste à traiter les resultats, pas
les appels."
c claire je peut envoyé l'endroit à la fonction PHP et de le recevoir, mais quand il s'agit de plusieurs fonctions et chaque fonction à son endroit d'affichage, je croix qu'il faut absulement utiliser un tableau je Js pour faire le dispatching !
Flachy Joe
Messages postés2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 20231 16 mars 2007 à 08:38
A chque fonction t'envoie le nom du div (par exmple) dans lequel afficher. Cette fonction te le renvoi en même temps que ses résultats. Avec ajax, tu chope le tout, tu retrouve le nom du div et tu y affiche le reste.
expl :
send ("?function=machin&dans=div_bidule")
send("?function=machin2$dans=la_boite")
XhrObj.onreadystatechange = function()
{if (XhrObj.readyState 4 && XhrObj.status 200)
//un morceau de parser XML pour séparer le nom du div et le resultat
nom_du_div.innerHTML = resultat
}
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 16 mars 2007 à 09:43
Hello,
jette un oeil à une autre de mes classes : NOTIMEOUT. Ca devrait te donner quelques idées...j'ai comme l'impression que c'est pas loin de ce que tu veux faire.
Là, tu verras que j'utilise la solution que te préconise J_G : la pile de processus.
Il faut effectivement y ajouter un élément : une priorisation.
Par contre, Flachy Joe a raison : IE refusera de débuter plusieurs processus en même temps avec un seul objet xmlhttp.
Mais comment tu a insérer $script_js dans le code JavaScript.
Le deuxième problème c’est un problème PHP :
Dans la boucle que j’ai développé, qui exécute plusieurs fonctions
PHP (voir le fichier function.php) je n’arrive
pas à exécuter une fonction déterminé par un nom variable :je qui
toujours obliger de tester touts les noms avec
la condition.
Vous trouer sur ce lien : www.crea-soft.net/ajax.zip les
trois fichiers (index.php, script.js et
function.php) ainsi que la base de données.