IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Ma routine AJAX ne s'exécute qu'une seule fois, des idées ?


Sujet :

AJAX

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Points : 49
    Points
    49
    Par défaut [AJAX] Ma routine AJAX ne s'exécute qu'une seule fois, des idées ?
    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:
    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>'    .
    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
    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']                    . '\')    )"'                        );
    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
     
    $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.
    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
    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) :
    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.
    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
     
     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:209
    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
     
     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"  />
    Problème identifié dans la console JS (juste) et à l'affichage web (faux) :
    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.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Points : 49
    Points
    49
    Par défaut
    Un grand merci à ThomasF pour son post http://www.developpez.net/forums/d14...onne-qu-seule/

    Il m'a permis de trouver mon erreur.

    Je fais référence à l'objet à modifier par son ID, et lors de la première mise à jour de l'objet, j'ai oublié de préciser son ID, donc objet introuvable pour les mises à jour suivantes.

    Avant correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $montant_HT	= array(	'name'		=> 'montant_HT'.$id_ordre_transport	,
    					'value'		=> $retour['montant_HT']			,
    					'tabindex'	=> ''								, // Trop compliqué à recalculer.
    					'step'		=> '0.01'							);
    Après correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $montant_HT	= array(	'name'		=> 'montant_HT'.$id_ordre_transport	,
    					'id'			=> 'montant_HT'.$id_ordre_transport	,
    					'value'		=> $retour['montant_HT']			,
    					'tabindex'	=> ''								, // Trop compliqué à recalculer.
    					'step'		=> '0.01'							);
    Encore merci ThomasF !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. La fonction "getElementById('x').value" ne s'exécute qu'une seule fois ?
    Par Hello_World dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 21/10/2010, 15h51
  2. Réponses: 38
    Dernier message: 02/11/2009, 18h20
  3. [AJAX] [XMLHttp][IE]Fonction qui ne fonctionne qu'une seule fois
    Par narnou dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/07/2007, 11h16
  4. Réponses: 8
    Dernier message: 26/10/2006, 16h46
  5. fonction qui s'exécute qu'une seule fois sous Firefox
    Par la.sophe dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/03/2006, 10h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo