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

JavaScript Discussion :

[AJAX] Plusieurs champs màj en fonction d'un seul...


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut [AJAX] Plusieurs champs màj en fonction d'un seul...
    Bonjour,
    En m'inspirant du tuto de siddh, je souhaite mettre à jour plusieurs champs de formulaire en fonction du choix fait dans une dropdown. Voilà mon code :
    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
     
    function go(){
    				UpdateName();
    				UpdateCustomer();
    			}
    			/**
    			* This method will change the project name in the textbox according to the selected project.
    			*/
    			function UpdateName(){
    				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){
    						NewHTMLCode = xhr.responseText;
    						alert(xhr.responseText);
    				// On se sert de innerHTML pour rajouter les options a la liste
    						document.getElementById('Name').innerHTML = NewHTMLCode ;
    					}
    				}
     
    				// Ici on va voir comment faire du post
    				xhr.open("POST","ModifyProject-FieldUpdate.php",true);
    				// ne pas oublier ça pour le post
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    				// ne pas oublier de poster les arguments
    				// ici, l'id du projet
    				sel = document.getElementById('Project');
    				projectid = sel.options[sel.selectedIndex].value;
    				xhr.send('ProjectID='+projectid+'&FieldNumber=1');
    			}
    			/**
    			* This method will change the default customer in the Customer selection dropdown according to the selected project.
    			*/
    			function UpdateCustomer(){
    				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){
    						NewHTMLCode = xhr.responseText;
    												// On se sert de innerHTML pour rajouter les options a la liste
    						document.getElementById('Customer').innerHTML = NewHTMLCode ;
    					}
    				}
     
    				// Ici on va voir comment faire du post
    				xhr.open("POST","ModifyProject-FieldUpdate.php",true);
    				// ne pas oublier ça pour le post
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    				// ne pas oublier de poster les arguments
    				// ici, l'id du projet
    				sel = document.getElementById('Project');
    				projectid = sel.options[sel.selectedIndex].value;
    				xhr.send('ProjectID='+projectid+'&FieldNumber=2');
    			}
    Le problème est le suivant :

    La seconde fonction appelée par go() s'execute correctement (grâce à votre aide d'ailleurs, merci encore ) mais la première ne s'execute pas : en insérant des alert je me suis rendu compte que le programme ne rentrait pas dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(xhr.readyState == 4 && xhr.status == 200)
    ...

    Avez vous une idée de solution ? Peut-être suis en train de faire fausse route, le fonction go appelée au changement de choix d'une liste deroulante va elle meme appeler une douzaine de fonctions qui mettront chacune à jour une partie de formulaire... Peut être y'a t'il une meilleure façon de proceder ?

    Merci !

  2. #2
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut
    alors en testant et retestant je me suis rendu compte que quelques fois ca rentrait dans le if mais que ça me mettait le code correspondant au second case du switch...

    Fichier ModifyProject-FieldUpdate.php :
    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
    <?php
    	global $dbcnx;
    	switch ($_POST["FieldNumber"]) {
    case 1:
    	echo "<select size=\"1\" name='Customer'>"; 
    	if(isset($_POST["ProjectID"])){
    		$res = mysql_query("SELECT Name FROM project 
    			WHERE ProjectID=".$_POST["ProjectID"]."",$dbcnx);
    		while($row = mysql_fetch_assoc($res)){
    			echo "<input type=\"text\" name=\"ProjectName\" size=\"12\" value='".$row["Name"]."'>";
    		}
    	}
    	break;
    case 2:
       echo "<select size=\"1\" name='Customer'>"; 
    	if(isset($_POST["ProjectID"])){
    		$res = mysql_query("SELECT c.CustomerID as id,c.Name as name FROM customer c, project p 
    			WHERE p.ProjectID=".$_POST["ProjectID"]." AND p.CustomerID=c.CustomerID ORDER BY c.Name",$dbcnx);
    		while($row = mysql_fetch_assoc($res)){
    			echo "<option selected value='".$row["id"]."'>".$row["name"]."</option>";
    		}
    		$res = mysql_query("SELECT c.CustomerID as id,c.Name as name FROM customer c, project p 
    			WHERE p.ProjectID=".$_POST["ProjectID"]." AND p.CustomerID!=c.CustomerID ORDER BY c.Name",$dbcnx);
    	    while ($val = mysql_fetch_array($res)){
    	    echo "<option value='".$val["id"]."'>".$val["name"]."</option>";
    	     }
    	}
     
    	echo "</select>";
       break;
    case 3:
       echo "probleme";
       break;
    case 4:
       echo "probleme";
       break;
    case 5:
       echo "probleme";
       break;
    case 6:
       echo "probleme";
       break;
    case 7:
       echo "probleme";
       break;
    case 8:
       echo "probleme";
       break;
    case 9:
       echo "probleme";
       break;
    case 10:
       echo "probleme";
       break;
    case 11:
       echo "probleme";
       break;
    }
    ?>

  3. #3
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    je pense que c'est un problème d'instances : il va faloir que tu crées deux instances différentes de ton objet xhh ...

    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
     
    var xhr = null;  <---- à dégager et à remettre dans la fonction
     
    			function getXhr(){
    				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;
    			}
    puis, dans tes fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    xhr_1 = getXhr();
    // et donc modifier tout tes appels à chr : 
    xhr.abort(); devient xhr_1.abort();
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  4. #4
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut Re: [AJAX] Plusieurs champs mis à jour en fonction d'un seul
    Citation Envoyé par Davboc
    Avez vous une idée de solution ? Peut-être suis en train de faire fausse route, le fonction go appelée au changement de choix d'une liste deroulante va elle meme appeler une douzaine de fonctions qui mettront chacune à jour une partie de formulaire... Peut être y'a t'il une meilleure façon de proceder ?

    Merci !

    XHR est asynchrone, qu'est ce que ça veux dire?

    L'objet xmlHttpRequest est la pluspart de temps utilisé en mode asynchrone (qui fait tout sont interet).
    En mode asynchrone, on donne l'adresse à laquelle l'objet XHR doit aller requeter (via la méthode open) puis sa réaction à faire quand la requete reviendra (via la proporiété onreadystatechange). Une fois XHR programmé de cette façon, on l'envoi par la méthode null.
    A partir de là, telle une fusée dans l'espace, XHR part au loin et est en mode automatique. JavaScript nous rends la main (à l'utilisateur et/ou au script javascript) en sachant que XHR est correctement programmé.
    Si maintenant on réutilise ce même objet XHR dans un script suivant directement le précédent, il y a fort à parier que celui-ci n'aura pas terminé sa requete.

    Et en lui passant des nouveau paramètres avec open, onreadystatechange et send, on lui annule complétement sa mission précédente et on lui en redonne une autre.

    Alors, comment effectuer plusieurs missions?

    Tout comme pour les fusées, les possiblités sont multiples:
    1. Se faire suivre les deux missions. Pour ça, il suffit d'indiquer à XHR qu'à son retour (onreadystatechange), il pourra directement repartir pour une autre mission.
    2. Effectuer les deux missions en parrallèle. Pou cela, nous allons devoir créer deux instances de xmlHttpRequest différentes (deux fusées), qui travailleront indépendamment.
    3. Réunir les deux missions. Généralement, si les deux missions se suivent, il serait bien plus simple de n'effecuter qu'une seule requete vers le serveur, cette requete ramenant l'information nécessaire pour les deux actions.
    4. Dernière possiblité, certainement la plus mauvaise: utiliser XHR en mode synchrone. Dans ce cas, le navigateur sera bloqué tant que la requete ne sera pas revenue.




    PS : Si je t'ai répondu de cette façon, c'est pour mettre en place une question/réponse à mettre dans la FAQ, vu le nombre de personnes qui nous posent cette question. Est-ce que l'explication te parait claire?

  5. #5
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut
    Oui merci, je crois avoir compris, mais n'est-ce pas ta solution 1 que j'ai utilisé ? Il y a à chaque fois un onreadystatechange dans mes fonctions...

    Quant à la solution 2, càd créer une instance de XHR pour chaque requete, donc pour chaque champ de mon formulaire ça m'amènerait creer une douzaine d'instances... Ca poserait pas de problème ?

  6. #6
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    l'idée du 1, c'est ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(xhr.readyState == 4 && xhr.status == 200){
                      NewHTMLCode = xhr.responseText;
    				  UpdateCustomer(); 
    				  }
    tu ne balance ta deuxième requête que lorsque la première est terminée
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  7. #7
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut
    Merci ! Je vais essayer ça ça me semble plus propre que la seconde...

    Y'a pas : Developpez.com ça ROXX !! 8)
    Merci infiniment sans vous j'y arriverait pas je me serais découragé depuis longtemps !!

  8. #8
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut
    Bon alors j'ai mis l'appel à la fonction updatecustomer dans la fonction updatename comme suivant :
    function UpdateName(){
    getXhr();
    // Definition of what to do when we'll have the server response
    xhr.onreadystatechange = function(){
    // If everything as been received and if the server is ok
    if(xhr.readyState == 4 && xhr.status == 200){
    NewHTMLCode = xhr.responseText;
    // We use innerHTML to change the HTML code
    document.getElementById('Name').innerHTML = NewHTMLCode ;
    //Call of the function that updates the next field
    UpdateCustomer();
    }
    }

    // Here we post the informations to generate the new HTML code
    xhr.open("POST","ModifyProject-FieldUpdate.php",true);
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    sel = document.getElementById('Project');
    projectid = sel.options[sel.selectedIndex].value;
    xhr.send('ProjectID='+projectid+'&FieldNumber=1');
    }
    J'ai donc viré la fonction go() qui est maintenant obsolète et mis dans le onchange du 1er select un appel à UpdateName...

    Ca devrait marcher d'après ce que vous me dites non ?
    Et pourtant... Maintenant je me retrouve avec un select vide placé devant mon champ de texte, qui maintenant est mis à jour, mais le second select ne l'est plus... j'ai m**dé ??

  9. #9
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par Davboc
    case 1:
    echo "<select size=\"1\" name='Customer'>";
    Pourquoi tu fais un echo d'un select dans le cas 1 ?!?!

    Ou alors, j'ai pas compris...

    Tu peux essayer de réexpliquer plus lentement ce qui se mets correctement en place (Name, Customer, les deux)? Et ce qui ne marche pas?

  10. #10
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut


    Les erreurs les plus grosses sont les moins visibles....... Merci ça marche farpaitement maintenant !! Désolé pour le boulettisme....

    Donc je reexplique pour info :

    Chaque projet a un nom et un client (et plein d'autres choses mais c pas important). Le but de ce formulaire est de Modifier les données d'un projet. On selectionne donc un projet dans une dropdown box complétée selon ce qu'il y a dans la BDD, puis ensuite le champ texte et la dropdown customer prennent une valeur par défaut selon le projet selectionné plus haut... Pour ensuite pouvoir eventuellement être modifiés...

    Suis-je clair ?

  11. #11
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par Davboc
    Les erreurs les plus grosses sont les moins visibles....... Merci ça marche farpaitement maintenant !! Désolé pour le boulettisme....
    Un petit pour la route, si ça marche

    (pour mes statistiques de résolution... )

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

Discussions similaires

  1. Renvoyer plusieur champs depuis une fonction
    Par djorfe dans le forum Langage
    Réponses: 2
    Dernier message: 29/02/2008, 09h54
  2. [AJAX] Ajax et PHP - Récupérer plusieurs champs ?
    Par stephnane dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/09/2007, 22h09
  3. [AJAX] Début en Ajax: actualisé un partie en fonction d'un champ
    Par FracMaster dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/06/2007, 14h40
  4. Fonction commune à plusieurs champs
    Par scorpion1611 dans le forum Access
    Réponses: 13
    Dernier message: 25/10/2006, 18h55
  5. Fonction vba somme de plusieurs champs
    Par Greg84 dans le forum Access
    Réponses: 4
    Dernier message: 09/08/2006, 15h16

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