Bonjour la communauté !
La question :
Je débute avec AJAX et je n'arrive pas à comprendre pourquoi mon code ne donne aucun changement à la deuxième exécution ?
Et je ne sais pas quoi afficher de plus dans la console pour trouver le problème.
La situation :
Application développée avec CodeIgniter (MVC).
Un formulaire avec une liste déroulante de course (point A vers point B) qui met à jour, en AJAX, le champ tarif, correspondant à la course choisie.
Le déroulé des codes en partant du formulaire :
1) La vue (pas d’intérêt particulier), le form_dropdown met à jour le form_number:2a) Le contrôleur, code qui met en forme le form_dropdown avec onchange qui appelle la fonction AJAX :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 '<th>' . form_label('№ course', 'id_course') . '</th>' . '<td>' . form_dropdown( $id_course[$i]['name'] , $id_course[$i]['options'] , $id_course[$i]['selected'] , $id_course[$i]['attributs'] ) . '</td>' . '<th>' . form_label('Montant HT', 'montant_HT') . '</th>' . '<td>' . form_number($montant_HT[$i]) . '</td>' .2b) Le contrôleur, code qui met en forme le form_number :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 $html['id_course'][$i] = array( 'name' => 'id_course'.$ordres_transports[$i]['id_ordre_transport'] , 'options' => $LD_BAS_courses , 'selected' => '' , 'attributs' => 'tabindex="' . (100 + 100 * $i + 5) . '" ' . 'title="' . $title[$i] . '"' . 'id="id_course' . $ordres_transports[$i]['id_ordre_transport'] . '" ' . // id pour AJAX méthode 1. 'onchange="MAJ_valeur_montant_HTidot( $( \'#'.$ordres_transports[$i]['id_ordre_transport'] . '\') , $( \'#id_etablissement_commanditaire'.$ordres_transports[$i]['id_ordre_transport'] . '\') , this.value , $( \'#type_tarif'.$ordres_transports[$i]['id_ordre_transport'] . '\') , $( \'#montant_HT'.$ordres_transports[$i]['id_ordre_transport'] . '\') )"' );3) La fonction JS/AJAX appelée par le onchange du form_dropdown :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $html['montant_HT'][$i] = array( 'name' => 'montant_HT'.$ordres_transports[$i]['id_ordre_transport'] , 'value' => $ordres_transports[$i]['montant_HT'] , 'tabindex' => 100 + 100 * $i + 21 , 'step' => '0.01' , 'id' => 'montant_HT'.$ordres_transports[$i]['id_ordre_transport'] ); // id pour AJAX méthode 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 /******************************************************************** * Mise à jour de montant_HT## en fonction du choix de id_course##. * ********************************************************************/ function MAJ_valeur_montant_HTidot(id_ordre_transport, valeur_etablissement_commanditaire, valeur_choisie, valeur_type_tarif, id_element_DOM) { //alert('AJAX - MAJ_valeur_montant_HTidot(id_ordre_transport, valeur_etablissement_commanditaire, valeur_choisie, valeur_type_tarif, id_element_DOM) '); console.log('AJAX'); console.log('id_ordre_transport : ' + id_ordre_transport[0].id); console.dir(id_ordre_transport); console.log('valeur_etablissement_commanditaire : ' + valeur_etablissement_commanditaire[0].value); console.dir(valeur_etablissement_commanditaire); console.log('valeur_choisie : ' + valeur_choisie); console.log('valeur_type_tarif : ' + valeur_type_tarif[0].value); console.dir(valeur_type_tarif); // Requête AJAX appelée en jQuery. // Dont le résultat va dans la variable contenu. //var contenu = ''; ne change rien, rien n'est fait à la deuxième exécution. var contenu = $.ajax( { // Exécution de la fonction recuperer_valeurs_LD() du contrôleur ordres_transports_c. // Qui prend en paramètre valeur_choisie. 'url' : '<?php echo site_url('ORDRES_TRANSPORTS/ordres_transports_c/MAJ_valeur_montant_HTidot'); ?>/' + id_ordre_transport[0].id + '/' + valeur_etablissement_commanditaire[0].value + '/' + valeur_choisie + '/' + valeur_type_tarif[0].value , // Lors d'un appel http en mode non asynchrone (?, pourquoi pas asynchrone ?). 'async' : false // La méthode responseText est appliquée au contenu récupéré par AJAX. }).responseText; console.log(contenu); console.table(contenu); // Le champ form_number concerné, reçoit le nouveaut contenu. id_element_DOM.replaceWith(contenu); }
4) La méthode PHP MAJ_valeur_montant_HTidot du contrôleur exécutée par url de AJAX :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 // Fonction exécutée sur appel par le code AJAX - Méthode 1, Utilisée dans la partie résultat (verte) pour les ID_xxx99 avec un numéro. // Mise à jour de montant_HT## en fonction du choix fait dans id_course## ou du choix fait dans type_tarif##. public function MAJ_valeur_montant_HTidot($id_ordre_transport, $id_etablissement_commanditaire, $id_course, $type_tarif) { $retour = $this->ordres_transports_m->calcul_montant_HT_OT($id_ordre_transport, $id_etablissement_commanditaire, $id_course, $type_tarif); echo 'quantite_courses_du_mois : ' . $retour['quantite_courses_du_mois'] . '<br />'; echo 'montant_HT : ' . $retour['montant_HT'] . '<br />'; $montant_HT = array( 'name' => 'montant_HT'.$id_ordre_transport , 'value' => $retour['montant_HT'] , 'tabindex' => '' , // Trop compliqué à recalculer. 'step' => '0.01' ); echo form_number($montant_HT); }
5) La méthode PHP calcul_montant_HT_OT du modèle exécutée par $retour = $this-> de PHP (pas d’intérêt particulier) :6a) Le contenu de la console JS, premier changement dans la liste déroulante (résultat ok) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165 public function calcul_montant_HT_OT($id_ordre_transport, $id_etablissement_commanditaire, $id_course, $type_tarif) { /* ********************************************************************************************************** * Calcul du montant HT * * Basé sur : * * 1) L'établissement commanditaire qui appartient à un établissement payeur * * 2) Le numéro de course * * 3) Le type de tarif * * => Le tarif, qui est basé sur l'établissement commanditaire et le numréro de course et le type de tarif * * **********************************************************************************************************/ // Pour AJAX. //echo 'id_ordre_transport : ' . $id_ordre_transport . '<br />'; //echo 'id_etablissement_commanditaire : ' . $id_etablissement_commanditaire . '<br />'; //echo 'id_course : ' . $id_course . '<br />'; //echo 'type_tarif : ' . $type_tarif . '<br />'; //echo 'type_tarif : ' . urldecode ( $type_tarif ) . '<br />'; //exit(); // Récupération de id_etablissement_payeur. $this->db->where( 'id_etablissement_commanditaire' ,$id_etablissement_commanditaire ); $enregistrement_etablissement_commanditaire = $this->db->get('etablissements_commanditaires')->result_array(); $id_etablissement_payeur = $enregistrement_etablissement_commanditaire[0]['id_etablissement_payeur']; //echo 'id_etablissement_payeur : ' . $id_etablissement_payeur . "<br />\n\r"; //exit(); // 1) 2) 3) fait dans ajouté. // 4) Récupération du tarif. $this->db->where( 'id_etablissement_payeur' ,$id_etablissement_payeur ); $this->db->where( 'id_course' ,$id_course ); $this->db->where( 'type_tarif' ,urldecode ( $type_tarif ) ); // urldecode() Pour AJAX, la valeur passe par l'URL et devient par exemple : forfait%20tourn%C3%A9e%20nuit-we-f%C3%A9ri%C3%A9 $enregistrement_tarif = $this->db->get('tarifs')->result_array(); //echo '<pre>enregistrement_tarif'; print_r($enregistrement_tarif); echo '</pre>'; //exit(); // Si un tarif existe. if ( !empty($enregistrement_tarif[0]) ) { //echo 'un tarif existe'; // Est-ce qu'il s'agit d'un tarif remisé ? => seuil_tarif_remise > 0 ? if ( $enregistrement_tarif[0]['seuil_tarif_remise'] > 0 ) { //echo 'modèle - seuil tarif remisé' . $enregistrement_tarif[0]['seuil_tarif_remise']; //exit(); // Si le tarif est remisé, il faut compter la quantité de courses dans le mois pour l'établissement payeur concerné, // et voir s'il est supérieur ou égal au seuil_tarif_remise. /* Il faut compter tous les enregistrements concernés par : * - Le mois en cours. * - La course choisie. * - L'établissement payeur, connu par l'établissement commanditaire (join). */ /* now() => 2008-08-31 12:05:34 * curdate() => 2008-08-31 * curtime() => 12:05:34 * * 0000-00-00 00:00:00 * * * 1 * ,1,7 => 0000-00 * ~~~~~~~ * 7 */ // $this->db->where( "MONTH(SUBSTR(`date_heure_ordre_transport`,1,10)) = MONTH(NOW()) AND `id_course` = " . $id_course ); $this->db->where( "SUBSTR(`date_heure_ordre_transport`,1,7) = SUBSTR(CURDATE(),1,7) AND `id_course` = " . $id_course ); $courses_du_mois = $this->db->get($this->table)->result_array(); //echo '<pre>modèle - courses du mois'; print_r($courses_du_mois); echo '</pre>'; //exit(); $quantite_courses_du_mois = $this->db->affected_rows(); $retour['quantite_courses_du_mois'] = $quantite_courses_du_mois; //echo 'modèle - quantite_courses_du_mois : ' . $quantite_courses_du_mois . '<br />'; //exit(); // Est que le seuil du tarif remisé est atteint ? Si oui, on applique le tarif remisé. if ( $quantite_courses_du_mois >= $enregistrement_tarif[0]['seuil_tarif_remise'] ) { //echo "$quantite_courses_du_mois >= DOLLARenregistrement_tarif[0]['seuil_tarif_remise']<br />"; $this->db->set('montant_HT', $enregistrement_tarif[0]['montant_HT_remise'] ); $this->db->where('id_ordre_transport', $id_ordre_transport); $this->db->update($this->table); // Pour AJAX : $retour['montant_HT'] = $enregistrement_tarif[0]['montant_HT_remise']; } // Si non (seuil non atteint), on applique le tarif normal. else { //echo " !!! ELSE - $quantite_courses_du_mois >= DOLLARenregistrement_tarif[0]['seuil_tarif_remise']<br />"; $this->db->set('montant_HT', $enregistrement_tarif[0]['montant_HT'] ); $this->db->where('id_ordre_transport', $id_ordre_transport); $this->db->update($this->table); // Pour AJAX : $retour['montant_HT'] = $enregistrement_tarif[0]['montant_HT']; } } // Si non, il ne s'agit pas d'un tarif remisé. else { // On applique simplement le tarif normal. $this->db->set('montant_HT', $enregistrement_tarif[0]['montant_HT'] ); $this->db->where('id_ordre_transport', $id_ordre_transport); $this->db->update($this->table); // Pour AJAX : $retour['montant_HT'] = $enregistrement_tarif[0]['montant_HT_remise']; $retour['quantite_courses_du_mois'] = -1; // -1 = non applicable. } } else // S'il n'existe pas de tarif, on met à 0,00. { $this->db->set('montant_HT', 0 ); $this->db->where('id_ordre_transport', $id_ordre_transport); $this->db->update($this->table); // Pour AJAX : $retour['montant_HT'] = 0; $retour['quantite_courses_du_mois'] = -1; // -1 = non applicable. } //echo '<pre>retour'; print_r($retour); echo '</pre>'; //exit(); // Pour AJAX et pour afficher la quantité de OT dans le mois. return $retour; } // Fin de la fonction.6b) Le contenu de la console JS, deuxième changement dans la liste déroulante (aucun changement, non ok) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 AJAX ordres_transports_c:211 id_ordre_transport : 21 ordres_transports_c:212 m.fn.init[1] ordres_transports_c:214 valeur_etablissement_commanditaire : 11 ordres_transports_c:215 m.fn.init[1] ordres_transports_c:217 valeur_choisie : 17 ordres_transports_c:219 valeur_type_tarif : forfait tournée jour ordres_transports_c:220 m.fn.init[1] jquery.min.js:4 XHR finished loading: GET "http://localhost/CI/CI220_FMT1/index.php/ORDRES_TRANSPORTS/ordres_transports_c/MAJ_valeur_montant_HTidot/21/11/17/forfait%20tourn%C3%A9e%20jour". ordres_transports_c:242 quantite_courses_du_mois : 0<br />montant_HT : 28.50<br /><input type="number" name="montant_HT21" value="28.50" tabindex="" step="0.01" /> ordres_transports_c:243 quantite_courses_du_mois : 0<br />montant_HT : 28.50<br /><input type="number" name="montant_HT21" value="28.50" tabindex="" step="0.01" /> ordres_transports_c:209Problème identifié dans la console JS (juste) et à l'affichage web (faux) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 AJAX ordres_transports_c:211 id_ordre_transport : 21 ordres_transports_c:212 m.fn.init[1] ordres_transports_c:214 valeur_etablissement_commanditaire : 11 ordres_transports_c:215 m.fn.init[1] ordres_transports_c:217 valeur_choisie : 13 ordres_transports_c:219 valeur_type_tarif : forfait tournée jour ordres_transports_c:220 m.fn.init[1] jquery.min.js:4 XHR finished loading: GET "http://localhost/CI/CI220_FMT1/index.php/ORDRES_TRANSPORTS/ordres_transports_c/MAJ_valeur_montant_HTidot/21/11/13/forfait%20tourn%C3%A9e%20jour". ordres_transports_c:242 quantite_courses_du_mois : 1<br />montant_HT : 28.00<br /><input type="number" name="montant_HT21" value="28.00" tabindex="" step="0.01" /> ordres_transports_c:243 quantite_courses_du_mois : 1<br />montant_HT : 28.00<br /><input type="number" name="montant_HT21" value="28.00" tabindex="" step="0.01" />
On voit bien dans la console JS que 28.50 est mis à jour par 28.00, mais cela n'est pas affiché dans le navigateur.
Le echo form_number($montant_HT); de public function MAJ_valeur_montant_HTidot() ne fait rien à la deuxième exécution.
Merci pour votre aide !
Nils.
Partager