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 :

Lier trois listes déroulantes


Sujet :

JavaScript

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut Lier trois listes déroulantes
    Bonjour,

    Avant toute remarque je précise que j'ai déjà recherché sur le forum des posts similaires à mon problème mais qu'aucun n'a pu m'aider, et que j'ai déjà lu le cours sur les listes liées car je l'ai déjà mis en place et ça marchait.


    Maintenant le pourquoi de mon post

    Voila j'affiche trois listes déroulantes sur ma page, remplies via une requête SQL faite au serveur.

    Lorsque je sélectionne une option dans la première liste, la deuxième se réduit comme je le veux.

    Par contre, je cherche à updater en même temps la troisième liste.
    Également, lorsque je sélectionne une option dans la deuxième, la troisième doit encore se modifier.

    Pour plus de compréhension, la première liste correspond aux types, la deuxièmes aux projets et la troisième aux applications.
    L'encapsulation est la suivante : les applis sont regroupées par projet, regroupés eux même par type.

    En clair je souhaite que lorsqu'on sélectionne un type, on ne voit plus que les projets et les applis correspondantes, et idem entre les projets et les applis.


    Voici mon code : (sans les options dans les listes pour ne pas encombrer)

    Tout d'abord la page principale :
    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
     
    <div style="display:inline;" >
    	<select name="appTypeName" onchange="updateProjectList(this.value);updateApplicationList(this.value, null);" >
    	</select>
    </div>
     
    <div style="display:inline;" id="projectList" >
    	<select name="projName" onchange="updateApplicationList(null, this.value);" >
    	</select>
    </div>
     
    <div style="display:inline;" id="applicationList" >
    	<select name="appName" >
    	</select>
    </div>


    Ensuite le script javascript qui contient les fonctions :
    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
     
    function getXhr() {
    	var xhr = null;
    	if(window.XMLHttpRequest) 
    		xhr = new XMLHttpRequest();
    	else if(window.ActiveXObject){ 
    		try {
    			xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		}
    		catch (e) {
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		}
    	}
    	else {
    		alert("Your browser doesn't support XMLHTTPRequest objects ...");
    		xhr = false;
    	}
    	return xhr;
    }
     
     
    function updateProjectList(appTypeName){
    	var xhr = getXhr();
     
    	xhr.onreadystatechange = function(){
    		if(xhr.readyState == 4 && xhr.status == 200){
    			leselect = xhr.responseText;
    			document.getElementById('projectList').innerHTML = '';
    			document.getElementById('projectList').innerHTML = leselect;
    		}
    	}
     
    	xhr.open("POST","projectList.php",true);
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr.send("appTypeName="+appTypeName);
    }
     
     
    function updateApplicationList(appTypeName, projName){
    	var xhr = getXhr();
     
    	xhr.onreadystatechange = function(){
    		if(xhr.readyState == 4 && xhr.status == 200){
    			leselect = xhr.responseText;
    			document.getElementById('applicationList').innerHTML = '';
    			document.getElementById('applicationList').innerHTML = leselect;
    		}
    	}
     
    	xhr.open("POST","applicationList.php",true);
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr.send("appTypeName="+appTypeName+"&projName="+projName);
    }


    Je pense qu'il est inutile de mettre le script php qui update la liste des projets car cette partie fonctionne parfaitement, voila donc le script qui update la liste des applications :
    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
     
    <?php
    	/**
    	* This script modify the application list on the incident page according to the selected application's type and the selected project
    	*/
     
    	if (isset($_POST['appTypeName'] && isset($_POST['projName']))
    	{
    		require_once("../../scripts/functions.php");
    		require_once("../../scripts/values.env");
     
    		$appTypeName = unescapeForm($_POST['appTypeName']);
    		$projName = unescapeForm($_POST['projName']);
     
    		$connect = connection();
     
    		//we will display a list which contains all the project's names
    		echo '<select name="appName" >
    				<option value="" ></option>';
     
    		if ($projName == "" || $projName == null)
    		{
    			if ($appTypeName == "" || $appTypeName == null)
    			{
    				$sqlRequest = 'SELECT appName, projName FROM Application';
    			}
    			else
    			{
    				$sqlRequest = 'SELECT appName, projName FROM Application WHERE ProjName LIKE\'%'.escapeRequest($appTypeName).'/%\'';
    			}
    		}
    		else
    		{
    			$sqlRequest = 'SELECT appName, projName FROM Application WHERE ProjName=\''.escapeRequest($projName).'\'';
    		}
     
    		$res = request($connect, $sqlRequest);
     
    		//remplissage des listes
     
    		echo '</select>&nbsp;';
    	}
    	echo 'ok';
    ?>

    Voila. Ce que j'ai donc: la liste des projets est correctement updatée, mais la liste des applications disparait (et il n'y a aucune erreur javascript)

    Merci d'avance pour votre aide car je cherche depuis hier soir sans résultat ...

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Je me trompe peut-être, mais l'ajout d'une valeur null dans l'url pose peut-être un problème ?

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    es-tu sûr que cette requête fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sqlRequest = 'SELECT appName, projName FROM Application WHERE ProjName LIKE\'%'.escapeRequest($appTypeName).'/%\'';
    Pour la tester, tape directement dans la barre d'adresse l'url qui la déclenche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    applicationList.php?appTypeName=appTypeName&projName=
    En mettant pour appTypeName une value d'option de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <select name="appTypeName">
    EDIT : effectivement, comme paramètre, '' serait peut-être préférable à NULL ...

    A+

  4. #4
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Alors pour la requête je suis sur de moi, je l'ai testé avant dans la console oracle elle me retourne bien ce que je souhaite.

    J'ai essayé de remplacer le null par '' et j'ai le même résultat.


    Enfin, j'ai essayé de saisir l'url directement et j'ai eu comme résultat une page vierge alors que j'ai mis un à la fin en dehors du if (ce qui devrait afficher le ok dans tous les cas)
    J'ai donc repassé tout le dernier script que je vous ai mi dans le 1er post et il s'est avéré qu'il manquait une parenthèse fermante .........
    Il n'y a donc aucun problème javascript tout marche à merveille !

    Merci à vous deux d'avoir répondu !

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

Discussions similaires

  1. lier une liste déroulante et un simple texte HTML
    Par gregolak dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/07/2006, 15h42
  2. Lier checkbox, liste déroulante et input texte
    Par pymouse dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/05/2006, 14h58
  3. Lier checkbox, liste déroulante et input texte
    Par pymouse dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 18/05/2006, 11h32
  4. [PHP-JS] Lier deux listes déroulantes
    Par budiste dans le forum Langage
    Réponses: 6
    Dernier message: 15/11/2005, 15h36
  5. [WD5.5] Lier deux listes déroulantes
    Par grellierj dans le forum WinDev
    Réponses: 7
    Dernier message: 11/10/2005, 17h33

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