Débutante Ajax - Action 'onClick'

charlottebardet
Invité n'ayant pas de compte PHPfrance

23 avr. 2008, 11:51

Bonjour :D

Dans le cadre d'un stage de fin de DUT je dois modifier une application à l'aide d'Ajax (afin d'éviter tout rechargement de ma page).

Etant toute nouvelle dans l'Ajax, je rencontre quelques difficultés :?

Mon problème est le suivant, j'ai fait des petits tests avec une fonction qui affiche un 'message d'alert' sur le clic de mon bouton.
Cette fonction fonctionne parfaitement :D

Mais le "onClick" du bouton doit en réalité lancer deux fonctions écritent en php; une de calcul, et une d'affichage.

- function calcul_TVA_TOTAL(){...}
- function aff_tva(-1,$sens){...}

C'est en fait un simple tableau "+" "-" que je modifie, je cherche à faire en sorte que sur le clic d'un "+" ou d'un "-" les sous-menus s'affichent ou se cachent sans rechargement de la page. Pour certains sous-menus cela ne pose pas de problème mais pour d'autres l'affichage nécessite des calculs préalables.

Comment inserer ses deuxfonctions dans mon code js ? :?

Ci-dessous ma fonction de test :

Code : Tout sélectionner

function go(){ var xhr = getXhr() // On défini ce qu'on va faire quand on aura la réponse xhr.onreadystatechange = function(){ // On ne fait quelque chose que si on a tout reçu et que le serveur est ok if(xhr.readyState == 4 && xhr.status == 200){ alert(xhr.responseText); } } xhr.open("GET","page/ajax.php",true); xhr.send(null); }

VaN
Mammouth du PHP | 1107 Messages

23 avr. 2008, 23:44

1. Est-ce que ça ne serait pas possible d'écrire ces fonctions en JS ?

2. Si ce n'est pas possible, il faut effectivement passer par de l'AJAX.
l'AJAX, c'est juste une combinaison de Javascript et de PHP. Le Javascript va demander au serveur d'effectuer certaines actions, le serveur renvoie une réponse, et JS l'interprète.

a. D'abord t'assurer que ta fonction XMLHttpRequest est correcte.
Pour ma part, j'utilise celle-ci, qui fonctionne parfaitement :

Code : Tout sélectionner

function creerXHR(url) { if(window.XMLHttpRequest) // FIREFOX xhr_object = new XMLHttpRequest(); else if(window.ActiveXObject) // IE xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); else // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); xhr_object.open("GET", url, false); xhr_object.send(null); if(xhr_object.readyState == 4) { //alert('data : '+xhr_object.responseText); return(xhr_object.responseText); } else { //alert("ca passe pas"); return(false); } }
Je fais me baser sur celle ci pour la suite :

b. D'abord, affecter tes 2 functions Javascript, qui vont lancer les fonctions PHP en Ajax, sur le onclick, on leur founissant les valeurs correctement :

Code : Tout sélectionner

<input type="button" name="calcul" onClick="calcul_TVA_Total(); aff_tva('-1', '<?php echo $sens; ?>')" />
c.et le script JS :

Code : Tout sélectionner

function calcul_TVA_Total() { retourJS = creerXHR('ajax.php?action=calculTVATotal); // Tu te retrouves avec le résultat de ta fonction PHP contenue dans ajax.php qui va se lancer si le test ($_GET['action'] == 'calculTVATotal') est vrai }
d.et le fichier ajax.php
if($_GET['action'] == 'calculTVATotal') {
// là tu fais tout tes calculs comme il faut
$TVATotal = ... ;

echo $TVATotal;
}
Avec ça, tu récupère normalement dans la variable Javascript "retourJS" la valeur de $TVATotal. à toi ensuite d'en faire ce que tu veux, dans la suite de ta fonction javascript calcul_TVA_Total().

c. bis Et suffit de refaire pareil pour l'autre fonction, en fournissant les 2 variables au fichier ajax.php :

Code : Tout sélectionner

functionaff_tva(valeur, sens) { retourJS2 = creerXHR('ajax.php?action=aff_tva&valeur='+valeur+'&sens='+sens); }
d. bis Et récupérer ces variables avec un _GET[''], dans le fichier ajax : )

Invité
Invité n'ayant pas de compte PHPfrance

24 avr. 2008, 10:26

Bonjour :D

Merci pour ta réponse très détaillée et très bien expliquée ! :D

Juste une petite question, dans ton point d) tu dis "// là tu fais tout tes calculs comme il faut", cad que je met tout le contenu de ma fonction calcul_TVA_TOTAL() ? Parce que en fait le code de ma fonction ressemble à ça :

Code : Tout sélectionner

function calcul_TVA_TOTAL(){ $result = mssql_query("SELECT ligcom.code_tva, sum(cast(ligcom.qterec_ligcom*ligcom.prixremht_ligcom as bigint)), sum(ligcom.qterec_ligcom) FROM (ligcom LEFT JOIN com on ligcom.id_com=com.id_com) WHERE ligcom.qterec_ligcom <> 0 AND CASE WHEN com.dtliv_com IS NOT NULL THEN (com.dtliv_com) ELSE CASE WHEN com.dprevliv_com IS NOT NULL THEN (com.dprevliv_com) ELSE (com.dtenvoi_com) END END >= '".$this->debut."' AND CASE WHEN com.dtliv_com IS NOT NULL THEN (com.dtliv_com) ELSE CASE WHEN com.dprevliv_com IS NOT NULL THEN (com.dprevliv_com) ELSE (com.dtenvoi_com) END END <= '".$this->fin."' GROUP BY ligcom.code_tva ORDER BY ligcom.code_tva"); $this->tva0_total = 0; $this->qtetva0_total = 0; $this->tva196_total = 0; $this->qtetva196_total = 0; $this->tva55_total = 0; $this->qtetva55_total = 0; $this->tva21_total = 0; $this->qtetva21_total = 0; while($rows = mssql_fetch_row($result)){ $this->montant_total = $this->montant_total + $rows[1]/10000; $this->qte_total = $this->qte_total + $rows[2]; if($rows[0]=='0'){ $tva0++; $this->tva0_total = $rows[1]/10000; $this->qtetva0_total = $rows[2]; } else if($rows[0]=='2'){ $tva196++; $this->tva196_total = $rows[1]/10000; $this->qtetva196_total = $rows[2]; } else if($rows[0]=='3'){ $tva55++; $this->tva55_total = $rows[1]/10000; $this->qtetva55_total = $rows[2]; } else if($rows[0]=='5'){ $tva21++; $this->tva21_total = $rows[1]/10000; $this->qtetva21_total = $rows[2]; } }
Est-ce que c'est genant ? :?

VaN
Mammouth du PHP | 1107 Messages

24 avr. 2008, 14:08

Bonjour :D

Merci pour ta réponse très détaillée et très bien expliquée ! :D

Juste une petite question, dans ton point d) tu dis "// là tu fais tout tes calculs comme il faut", cad que je met tout le contenu de ma fonction calcul_TVA_TOTAL() ?
A priori, je dirai oui.

Et si je dis pas de bétise, il faut que ta fonction se termine par un echo() de ce que tu souhaites renvoyer à Javascript, pour que la fonction javascript puisse l'interpréter, donc un
echo $this->qtetva0_total;
, si j'ai bien lu ton script.

Invité
Invité n'ayant pas de compte PHPfrance

24 avr. 2008, 14:25

D'accord ! :wink:

J'ai bien fait tout ce que tu m'a dis, j'ai mon appel de fonctions sur le 'onclick'

Code : Tout sélectionner

<td class="RowHeader10" nowrap>&nbsp;&nbsp;&nbsp;<a onclick="javascript:changerSigne(1);calcul_TVA_Total(); aff_tva('-1', '<?php echo $sens; ?>')"><img name="image" src="img/plus.GIF"></a>&nbsp;TVA</td>
Mon fichier JS

Code : Tout sélectionner

function getXhr(){ var xhr = null; if(window.XMLHttpRequest) // Firefox et autres xhr = new XMLHttpRequest(); else if(window.ActiveXObject){ // Internet Explorer try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } } else { // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); xhr = false; } return xhr } function calcul_TVA_Total() { retourJS = getXhr('ajax.php?action=calculTVATotal'); // On se retrouves avec le résultat de la fonction PHP contenue dans ajax.php qui va se lancer si le test ($_GET['action'] == 'calculTVATotal') est vrai } function aff_tva(valeur, sens) { retourJS2 = getXhr('ajax.php?action=aff_tva&valeur='+valeur+'&sens='+sens); }
Et mon fichier ajax.php

Code : Tout sélectionner

<?php if($_GET['action'] == 'calculTVATotal') { echo "calculTVATotal"; $result = mssql_query("SELECT ligcom.code_tva, sum(cast(ligcom.qterec_ligcom*ligcom.prixremht_ligcom as bigint)), sum(ligcom.qterec_ligcom) FROM (ligcom LEFT JOIN com on ligcom.id_com=com.id_com) WHERE ligcom.qterec_ligcom <> 0 AND CASE WHEN com.dtliv_com IS NOT NULL THEN (com.dtliv_com) ELSE CASE WHEN com.dprevliv_com IS NOT NULL THEN (com.dprevliv_com) ELSE (com.dtenvoi_com) END END >= '".$this->debut."' AND CASE WHEN com.dtliv_com IS NOT NULL THEN (com.dtliv_com) ELSE CASE WHEN com.dprevliv_com IS NOT NULL THEN (com.dprevliv_com) ELSE (com.dtenvoi_com) END END <= '".$this->fin."' GROUP BY ligcom.code_tva ORDER BY ligcom.code_tva"); $this->tva0_total = 0; $this->qtetva0_total = 0; $this->tva196_total = 0; $this->qtetva196_total = 0; $this->tva55_total = 0; $this->qtetva55_total = 0; $this->tva21_total = 0; $this->qtetva21_total = 0; while($rows = mssql_fetch_row($result)){ $this->montant_total = $this->montant_total + $rows[1]/10000; $this->qte_total = $this->qte_total + $rows[2]; if($rows[0]=='0'){ $tva0++; $this->tva0_total = $rows[1]/10000; $this->qtetva0_total = $rows[2]; } else if($rows[0]=='2'){ $tva196++; $this->tva196_total = $rows[1]/10000; $this->qtetva196_total = $rows[2]; } else if($rows[0]=='3'){ $tva55++; $this->tva55_total = $rows[1]/10000; $this->qtetva55_total = $rows[2]; } else if($rows[0]=='5'){ $tva21++; $this->tva21_total = $rows[1]/10000; $this->qtetva21_total = $rows[2]; } } echo $this->qtetva0_total; } if($_GET['action'] == 'aff_tva&valeur=+valeur+'&sens='+sens') { echo "aff_tva"; if($h==-1){ $t[0] = $this->tva0_total; $tx[0] = 1; $t[1] = $this->tva21_total; $tx[1] = 2; $t[2] = $this->tva55_total; $tx[2] = 3; $t[3] = $this->tva196_total; $tx[3] = 4; } else{ $t[0] = $this->tva0[$h]; $tx[0] = 1; $t[1] = $this->tva21[$h]; $tx[1] = 2; $t[2] = $this->tva55[$h]; $tx[2] = 3; $t[3] = $this->tva196[$h]; $tx[3] = 4; } $temp = ''; $temp2 = ''; $longueur = count($t); $desordre = true; while($desordre){ $desordre = false; for($i=0;$i<($longueur-1);$i++){ if($sens == 'ASC'){ if($t[$i]>$t[$i+1]){ $temp = $t[$i]; $temp2 = $tx[$i]; $t[$i] = $t[$i+1]; $tx[$i] = $tx[$i+1]; $t[$i+1] = $temp; $tx[$i+1] = $temp2; $desordre = true; } } else{ if($t[$i]<$t[$i+1]){ $temp = $t[$i]; $temp2 = $tx[$i]; $t[$i] = $t[$i+1]; $tx[$i] = $tx[$i+1]; $t[$i+1] = $temp; $tx[$i+1] = $temp2; $desordre = true; } } } } for($j = 0;$j<$longueur;$j++){ if($tx[$j]==1) $this->aff_tva0($h); else if($tx[$j]==2) $this->aff_tva21($h); else if($tx[$j]==3) $this->aff_tva55($h); else if($tx[$j]==4) $this->aff_tva196($h); } } ?>

Je n'ai aucune erreur ! Mais il ne se passe absolument rien^^ Mis à part le changement du '+' en'-' ou du '-' en '+' :?

VaN
Mammouth du PHP | 1107 Messages

24 avr. 2008, 16:58

Je n'ai aucune erreur ! Mais il ne se passe absolument rien^^ Mis à part le changement du '+' en'-' ou du '-' en '+' :?
Car tu as oublié une phase primordiale :
Avec ça, tu récupère normalement dans la variable Javascript "retourJS" la valeur de $TVATotal. à toi ensuite d'en faire ce que tu veux, dans la suite de ta fonction javascript calcul_TVA_Total().
une fois ta valeur récupérée grâce au XMLHttpRequest, dans ta fonction JS, c'est à dire là :

Code : Tout sélectionner

retourJS = getXhr('ajax.php?action=calculTVATotal'); // On se retrouves avec le résultat de la fonction PHP contenue dans ajax.php qui va se lancer si le test ($_GET['action'] == 'calculTVATotal') est vrai
Il faut, grâce à Javascript, en faire quelque chose. Pour le moment, la valeur est juste contenue dans la varable retourJS. Tu peux par exemple l'afficher dans un <div id="TVACalculee">, sur ta page HTML, grâce à :

Code : Tout sélectionner

document.getElementById('TVACalculee').innerHTML = retourJS;
à placer juste après retourJS = getXhr();, dans la fonction JS.

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

Invité
Invité n'ayant pas de compte PHPfrance

24 avr. 2008, 17:22

Ok!

Mais en fait, d'après ce que j'ai pu observer... il semblerait que mes les fonctions de mon fichier ajax.php ne sont executées :? (j'ai mis des echo)

VaN
Mammouth du PHP | 1107 Messages

24 avr. 2008, 17:48

Ok!

Mais en fait, d'après ce que j'ai pu observer... il semblerait que mes les fonctions de mon fichier ajax.php ne sont executées :? (j'ai mis des echo)
le problème d'ajax c'st que c'est assez chiant à debugger. si tu veux d'abord debugger la fonction PHP du fichier ajax, browse directement le fichier ajax.php?action=CalculTVATotal dans ton navigateur, plutot que de lancer la fonction javascript en cliquant sur ton bouton. Une fois que ton fichier ajax.php te retourne ce que tu souhaites obtenir, tu peux commencer a debugger le reste : )

La si tu browse ajax.php?action=CalculTVATotal, est-ce qu'il t'affiches tes echo() ?

Invité
Invité n'ayant pas de compte PHPfrance

25 avr. 2008, 09:26

Non, il me met une erreur sur cette ligne :

Code : Tout sélectionner

if($_GET['action'] == 'aff_tva&valeur=+valeur+'&sens='+sens') {

Invité
Invité n'ayant pas de compte PHPfrance

25 avr. 2008, 09:31

C'est bon maintenant il me met une erreur à la ligne

Code : Tout sélectionner

else{ $t[0] = $this->tva0[$h]; ...
Et là je vois pas pourquoi :?
Il m'affiche bien mon echo "aff_tva" par contre, mais pas le echo de la fonction qui précède.

Code : Tout sélectionner

if($_GET['action'] == 'aff_tva&valeur='+valeur+'&sens='+sens) { echo "aff_tva"; if($h==-1){ $t[0] = $this->tva0_total; $tx[0] = 1; $t[1] = $this->tva21_total; $tx[1] = 2; $t[2] = $this->tva55_total; $tx[2] = 3; $t[3] = $this->tva196_total; $tx[3] = 4; } else{ $t[0] = $this->tva0[$h]; $tx[0] = 1; $t[1] = $this->tva21[$h]; $tx[1] = 2; $t[2] = $this->tva55[$h]; $tx[2] = 3; $t[3] = $this->tva196[$h]; $tx[3] = 4; } $temp = ''; $temp2 = ''; $longueur = count($t); $desordre = true; while($desordre){ $desordre = false; for($i=0;$i<($longueur-1);$i++){ if($sens == 'ASC'){ if($t[$i]>$t[$i+1]){ $temp = $t[$i]; $temp2 = $tx[$i]; $t[$i] = $t[$i+1]; $tx[$i] = $tx[$i+1]; $t[$i+1] = $temp; $tx[$i+1] = $temp2; $desordre = true; } } else{ if($t[$i]<$t[$i+1]){ $temp = $t[$i]; $temp2 = $tx[$i]; $t[$i] = $t[$i+1]; $tx[$i] = $tx[$i+1]; $t[$i+1] = $temp; $tx[$i+1] = $temp2; $desordre = true; } } } } for($j = 0;$j<$longueur;$j++){ if($tx[$j]==1) $this->aff_tva0($h); else if($tx[$j]==2) $this->aff_tva21($h); else if($tx[$j]==3) $this->aff_tva55($h); else if($tx[$j]==4) $this->aff_tva196($h); } }

Invité
Invité n'ayant pas de compte PHPfrance

25 avr. 2008, 09:45

C'est bon pour ça aussi ! :wink:
Je debug je debug ...

Invité
Invité n'ayant pas de compte PHPfrance

25 avr. 2008, 10:06

Une erreur bizare :(

Code : Tout sélectionner

Fatal error: Call to undefined method stdClass::aff_tva0() in C:\Pharmavitale\Fichiers\PHP\Stats\page\ajax.php on line 108
ce qui correspond à :

Code : Tout sélectionner

if($tx[$j]==1) $achat->aff_tva0($h);
et ma fonction aff_tva0($h) est dans ma classe achat.

Ce qui est bizar c'est que $achat->tva0_total; par exemple, ça lui pose aucun pb ! Et ma variable tva0_total est elle aussi dans ma classe achat.