3 listes déroulantes : Pb Mise à jour de la 2ème

Eléphanteau du PHP | 15 Messages

14 juin 2007, 12:32

Bonjour,

Comme je l'ai expliqué dans un post précédent http://www.phpfrance.com/forums/viewtop ... 862#197862, je suis novice en PHP, Javascript et AJAX. Je me galère depuis une semaine à trouver une solution pour 3 listes déroulantes.
Je tiens à remercier Sékiltoyai qui m'a aidé pour faire fonctionné mes listes en PHP. Entre-temps j'ai réussi à faire évoluer mes listes déroulantes en AJAX à partir de cet exemple : http://www.phpcs.com/code.aspx?ID=39194

Mon problème est que la première fois tout fonctionne, mais si je sélectionne de nouveau dans la première liste, la seconde ne se recharge pas (ne rechargeant donc pas la troisième).

Je me dis qu'il me manque le bout de code qui dit "quand une autre formation est choisie, recharge la deuxième liste". J'ai dû me tromper dans ma logique car je me suis dit que ça devait se faire avec cette ligne de code :

Code : Tout sélectionner

document.getElementById('niv'+id_liste).innerHTML=xmlhttp.responseText;
et donc que je devais rajouter une balise <span> pour la première liste, mais ça n'a ne fonctionne pas.

Quelqu'un pourrait-il m'aiguiller que je puisse m'améliorer ?
Savoir si je suis dans la bonne direction, faudrait-il rajouter une function ValideLd1 (j'ai essayé mais ça n'a pas marché non plus...

Voici le code de la page ListeCP.php où les listes s'affichent :

Code : Tout sélectionner

<script type="text/javascript"> /** * Lister les lieux et dates d'une formation avec un objet * XMLHTTPRequest. */ /* Création des variables globales qui contiendront l'objet XHR */ var Ld1Id=''; var Ld2Id=''; var id_liste=''; function ValideLd2(val) { Ld1Id=val; //id_département id_liste='2';//Utilisé dans la fonction ChargeLd() pour identifier la liste déroulante var LD_URL = 'ValideLd2.php?Ld1='+Ld1Id; ObjetXHR(LD_URL) // Réinitialisation de Ld3 si modification de LD1 après passage en Ld2 if (Ld2Id!='') {ValideLd3(''); } } function ValideLd3(val) { Ld2Id=val; //id_commune id_liste='3'; //Utilisé dans la fonction ChargeLd() pour identifier la liste déroulante var LD_URL = 'ValideLd3.php?Ld1='+Ld1Id+'&Ld2='+Ld2Id; if (Ld2Id=='') {var LD_URL = 'ValideLd3.php';} ObjetXHR(LD_URL) } /** * Fonction privée qui va créer un objet XHR. * Cette fonction initialisera la valeur dans la variable globale définie ci-dessus. */ function ObjetXHR(LD_URL) { //creation de l'objet XMLHttpRequest if (window.XMLHttpRequest) { // Mozilla,... /* On tente de créer un objet XmlHTTPRequest */ xmlhttp=new XMLHttpRequest(); if (xmlhttp.overrideMimeType) { xmlhttp.overrideMimeType('text/xml'); } /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */ xmlhttp.onreadystatechange=ChargeLd; /* Envoi de la requête à la page de traitement */ xmlhttp.open("GET", LD_URL, true); xmlhttp.send(null); } else if (window.ActiveXObject) { //IE /* On tente de créer un objet XmlHTTPRequest */ xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); if (xmlhttp) { /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */ xmlhttp.onreadystatechange=ChargeLd; /* Envoi de la requête à la page de traitement */ xmlhttp.open('GET', LD_URL, false); xmlhttp.send(); } } // Bouton non apparent car modification de LD1 ou Ld2 document.getElementById('buttons').style.display='none'; } // fonction pour manipuler l'appel asynchrone function ChargeLd() { /* Lorsque l'état est à 4 */ if (xmlhttp.readyState==4) { /* Si on a un statut à 200 */ if (xmlhttp.status==200) { /* Mise à jour de l'affichage */ //span id="niv2" ou "niv3" document.getElementById('niv'+id_liste).innerHTML=xmlhttp.responseText; if (xmlhttp.responseText.indexOf('disabled')<=0) { //focus sur liste déroulante 2 ou 3 document.getElementById('Liste'+id_liste).focus(); } } } } function Affiche_Btn() { document.getElementById('buttons').style.display='inline'; } </script>
 <form method="get" action="ListeCP.php">
    
    <span id="niv1">
	<?php include 'ValideLd1.php'; ?></span>&nbsp; <!--Pour remplir la liste déroulante 1-->
    <span id="niv2">
    <?php include 'ValideLd2.php'; ?></span>&nbsp; <!--Pour remplir la liste déroulante 2-->
    <span id="niv3">
    <?php include 'ValideLd3.php'; ?></span>&nbsp; <!--Pour remplir la liste déroulante 3-->
    <span id="buttons">
    <input type="submit" value="Valider">
    </span>
  </form>
La page ValideLd1.php :
<?PHP
include("connexionbd.php");
$rq="Select id_formations,nom_formations from formation order by nom_formations";
$rq_pos_id=0; //position dans le SQL de la clé de la liste déroulante idem dans ValideLd2.php et ValideLd3.php
$rq_pos_val=1; //position dans le SQL de la valeur de la liste déroulante idem dans ValideLd2.php et ValideLd3.php 

$result= mysql_query ($rq) or die ("Select impossible");
$retour = '<select name="Liste1" id="Liste1" size="1" onchange="ValideLd2(this[this.selectedIndex].value);">';
$retour .= '<option selected value="">Choisir...</option>';
if (mysql_num_rows($result) != 0) {
	while ($row = mysql_fetch_row($result)) {
		$retour .= '<option value="'. $row[$rq_pos_id] .'">'. htmlentities($row[$rq_pos_val]) .'</option>';
		}
		$retour .= '</select>';
} else {
	$retour = '<input id="size" type="text" size="10" value="Aucune valeur" disabled>';
}
mysql_free_result($result);
mysql_close($connexion);
echo $retour
?>
La page ValideLd2.php :
<?PHP
include("connexionbd.php");
 $Ld1_retour =''; //id_département clé de la liste déroulante 1

if (isset($_GET['Ld1'])) {$Ld1_retour = $_GET['Ld1'];}

if ($Ld1_retour!='') {
	$rq="Select* from date_formations where id_formations='".$Ld1_retour."' order by date_date";
	$rq_pos_id=0;
	$rq_pos_val=1;
	$result= mysql_query ($rq) or die ("Select impossible");
	$retour = '<select name="Liste2" id="Liste2" size="1" onchange="ValideLd3(this[this.selectedIndex].value);">';
	$retour .= '<option selected value="">Choisir...</option>';

	if (mysql_num_rows($result) != 0) {
		while ($row = mysql_fetch_row($result)) {
			$retour .= '<option value="'. $row[$rq_pos_id] .'">'. htmlentities($row[$rq_pos_val]) .'</option>';
		}
		$retour .= '</select>';
	} else {
		$retour = '<input id="Liste2" type="text" size="10" value="Aucune valeur" disabled>';
	}
	mysql_free_result($result);
	mysql_close($connexion);
}else{
	$retour = '<select name="Liste2" id="Liste2" size="1" disabled><option>Aucune valeur</option></select>';
}	
echo $retour
?>
La page ValideLd3.php :
<?PHP
include("connexionbd.php");

$Ld1_retour =''; //id_département clé de la liste déroulante 1 
$Ld2_retour =''; //id_commune clé de la liste déroulante 2	

if (isset($_GET['Ld1'])) {$Ld1_retour = $_GET['Ld1'];}
if (isset($_GET['Ld2'])) {$Ld2_retour =  $_GET['Ld2'];}

if (($Ld1_retour!='')&&($Ld2_retour!='')) {
	$rq="Select lieu_date from date_formations where id_formations='".$Ld1_retour."' AND id_date='".$Ld2_retour."' order by lieu_date";
	$rq_pos_id=0;
	$rq_pos_val=0;
	$result= mysql_query ($rq) or die ("Select impossible");
	$retour = '<select name="Liste3" id="Liste3" size="1" onchange="Affiche_Btn();">';
	$retour .= '<option selected value="">Choisir...</option>';

	if (mysql_num_rows($result) != 0) {
		while ($row = mysql_fetch_row($result)) {
			$retour .= '<option value="'. $row[$rq_pos_id] .'">'. htmlentities($row[$rq_pos_val]) .'</option>';
		}
		$retour .= '</select>';
	} else {
		$retour = '<input id="Liste3" type="text" size="10" value="Aucune valeur" disabled>';
	}
	mysql_free_result($result);
	mysql_close($connexion);
}else{
	$retour = '<select name="Liste3" id="Liste3" size="1" disabled><option>Aucune valeur</option></select>';
}	
echo $retour
?>

En tout cas, merci de votre aide ! :)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

14 juin 2007, 15:20

Ton code est compliqué même sans Ajax. Réfléchi à une solution simple pour gérer le système relationnel entre tes listes. Aujourd'hui elles sont 3 demain ça sera moins ou plus.

Le but de la programmation est aussi d'adopter des méthodes de travail et des solutions réutilisables qui font gagner du temps.

Dans ton cas on peut penser à un méchanisme objet:
Tu gère des listes (nature commune d'objet)
Chaque liste provoque le changement d'une autre liste qui lui est liée (relation père/fils)

C'est le concept objet qui te faut.

Alors ma proposition est de concevoir un objet liste qui se remplit et s'affiche à un emplacement donné, puis qui est capable de déclencher le remplissage et l'affichage de toutes les sous-listes qui lui sont liées à chaque changement de sa sélection.

De cette manière tu n'auras pas à reprogrammer l'effet de cascade déclenché par un changement au niveau d'un parent.

Selon le modèle conceptuel suivant:
List --- (1) liée à (n) ---> List

Quand un objet List change => cet objet doit actualiser toutes ses relations "liée à"
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

14 juin 2007, 17:27

Voici une contribution concernant une solution objet (Listes liées)

Le principe est simple:
Une liste (listbox) a des options (items) où chaque option (item) est liée à une autre liste (listbox) et ainsi de suite.
Si on sélectionne une option dans une liste affichée, en principe, l'option choisie doit afficher sa liste sous-jascente.

Bonne lecture, je l'ai testé et ça marche :wink:
 <?php
/*
Définition de l'objet "Item" élément d'une liste':
*/
class Item {
//Propriétés publiques
    public $parent=null, $value="", $text="", $selected=false, $child=null; 
//Méthodes publiques
	//constructeur d'un Item appartenant à un parent ListBox et lié à un fils (child) ListBox
    public function Item($parent, $value, $text=null, $selected=false, $child=null){
        $this->parent=$parent; 
        $this->value=$value; 
        $this->text=$text?$text:$value;
        $this->selected=$selected;
        $this->child=$child;
    }
	//Item est-t-il sélectionné?
    public function isSelected(){
        $selectedValue = $this->parent &&$_POST?$_POST["{$this->parent->name}"]
						:$this->parent &&$_GET?$_GET["{$this->parent->name}"]:$this->selected;
		if ( $this->value == $selectedValue) $this->selected = true; else $this->selected = false;
		return $this->selected;
    }
    //Affichage de l'Item
	public function Show(){
        //Trouver si l'Item est sélectionné
		$selected = $this->isSelected()?" SELECTED ":"";
		//Afficher la définition HTML de l'Item <OPTION>
        echo 
<<<HTML
<OPTION VALUE="$this->value" $selected >$this->text</OPTION>
HTML;
    }
    //Suppression de l'objet fils lié à cet Item
	public function RemoveChild(){ $this->child=null; }
}

/*
Définition de l'objet "ListBox":
*/
class ListBox {
//Propriétés publiques:
    public     $title="", $id="", $name="", $value="", $size=1,  $jsEvent="", $Items=array(), $visible=true;
//Méthodes publiques:
    //Constructeur de la ListBox, items est la collection des options (objets Item)
	public function ListBox($name=null, $title=null, $items=null){
        $this->title = $title;
        $this->name = $name;
        $this->Fill($items); //remplit la liste par les items donnés
    }
    //Remplir la ListBox par les items donnés
	public function Fill($items=array()){
        if ($items && count($items)>0) foreach($items as $item){
					//Ajouter les items un par un dans la ListBox
                    $this->AddItem($item->value, $item->text, $item->selected, $item->child);
		}
    }
	//Ajouter un Item donné
    public function AddItem($value, $text=null, $selected=false, $child=null){
		//Un item est affecté comme un objet fils de la ListBox (this) (les items sont indexés par value)
        $this->items[$value] = new Item($this, $value, $text, $selected, $child);
    }
	//Déterminer quel Item est sélectionné
    public function SelectedItem(){
        if ($this->items && count($this->items)>0) foreach($this->items as $item) {
            //si l'Item est sélectionné, le retourner
			if ($item->isSelected()) return $item;
        }
        return null;
    } 
	//Afficher la ListBox, sa définition HTML et celle de ses items
    public function Show($showItemChild=true){
        //Bien sûr si son état est visible
		if ($this->visible){
            //définition HTML du SELECT
			echo 
<<<HTML
<SPAN><b>$this->title</b> <SELECT ID="$this->id" NAME="$this->name" VALUE="$this->value" SIZE="$this->size" $this->jsEvent >    
HTML;
            //Parcourir les items en affichant leur définition HTML <OPTION>
			if ($this->items && count($this->items)>0) foreach($this->items as $item) {
                //Afficher l'Item
				$item->Show();
            }
            echo 
<<<HTML
</SELECT></SPAN>    
HTML;
            //Afficher l'objet (child) liés à l'Item sélectionné
			if ($showItemChild && ($SelectedItem = $this->SelectedItem()) && $SelectedItem->child){
                //Le child est trouvé, l'afficher
				$SelectedItem->child->Show();
			}
        }//End if visible
    }//End Show
    //Supprimer tous les items
    public function RemoveItems(){$this->items = array();} 
	//Supprimer un item donné (les items sont indexés par value)
    public function RemoveItem($value){unset($this->items[$value]);}
}

//test de l'objet ListBox
$pays = new ListBox("pays", "Pays");
//
$villes_france = new ListBox("ville", "Ville");
$villes_france->AddItem("paris", "Paris", true);
$villes_france->AddItem("le mans", "Le Mans");
$pays->AddItem("fr", "France", true, $villes_france);
//
$villes_maroc = new ListBox("ville", "Ville");
$villes_maroc->AddItem("marrakech", "Marrakech", true);
$villes_maroc->AddItem("oujda", "Oujda");
$pays->AddItem("ma", "Maroc", false, $villes_maroc);
//
$pays->jsEvent="onChange=\"this.form.submit();\"";
//
echo "<form>";
$pays->Show();
echo "</form>";
?> 
Modifié en dernier par sadeq le 14 juin 2007, 19:30, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 15 Messages

14 juin 2007, 18:59

C'est super sympa, je regarde ça je pense ce week-end, entre-temps j'ai fait d'autres recherches, je post tout ça week-end..Merci de ton aide..Ca me motive!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

14 juin 2007, 19:31

Attention, j'ai apporté quelque réglages et ajouté des commentaire au code. :wink:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 15 Messages

15 juin 2007, 16:53

Merci sadeq, je n'ai pas encore eu le temps de bien étudier ton code, mais je me pose une question quand même...Peut-on l'adapter avec une base de données car j'ai le sentiment qu'on rentre les données en bas dans :

Code : Tout sélectionner

$pays = new ListBox("pays", "Pays"); // $villes_france = new ListBox("ville", "Ville"); $villes_france->AddItem("paris", "Paris", true); $villes_france->AddItem("le mans", "Le Mans"); $pays->AddItem("fr", "France", true, $villes_france); // $villes_maroc = new ListBox("ville", "Ville"); $villes_maroc->AddItem("marrakech", "Marrakech", true); $villes_maroc->AddItem("oujda", "Oujda"); $pays->AddItem("ma", "Maroc", false, $villes_maroc);

Par exemple pays et ville peuvent être remplacés par le nom de mes tables ? Bon faut que j'étudie ça car au premier test juste copier-coller ça me met une erreur :
Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in z:\program files\easyphp1-8\www\site-agilicom\sadeq.php on line 7
C'est parce que je n'ai pas PHP 5 ?
Je regarde ça ce week-end ou lundi promis..En tout cas merci de m'aider à progresser...



Sinon voilà ce que j'avais fait aussi (faut pas mentir je me suis aidée d'un tutorial !)et qui ne marche pas..Ca aurait étonnant autrement ! :?
La partie JavaScript dans la page liste-deroulante.php:

Code : Tout sélectionner

<script type='text/javascript'> var xhr = null; // Renvoie le texte de l'objet ActiveXObject le plus récent depuis une liste var pickRecentProgID = function (idList){ // found progID flag var bFound = false; for(var i=0; i < idList.length && !bFound; i++){ try{ var oDoc = new ActiveXObject(idList[i]); o2Store = idList[i]; bFound = true; }catch (objException){ // trap; try next progID }; }; if (!bFound) throw ("Aucun ActiveXObject n'est valide sur votre ordinateur, pensez à mettre à jour votre navigateur"); idList = null; return o2Store; } // Retourne un nouvel objet XmlHttpRequest var GetXmlHttpRequest_AXO=null var GetXmlHttpRequest=function () { if (window.XMLHttpRequest) { return new XMLHttpRequest() } else if (window.ActiveXObject) { if (!GetXmlHttpRequest_AXO) { GetXmlHttpRequest_AXO=pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]); } return new ActiveXObject(GetXmlHttpRequest_AXO) } return false; } // Compatibilité avec le script du tutoriel AJAX (developpez.com) getXhr=GetXmlHttpRequest; /** * Méthode qui sera appelée sur le click du bouton */ 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){ leselect = xhr.responseText; // On se sert de innerHTML pour rajouter les options a la liste avec l'id du select de la date document.getElementById('date_form').innerHTML = leselect; } } // Ici on va voir comment faire du post xhr.open("POST","Ajaxdate.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 select formation sel = document.getElementById('forma'); idforma = sel.options[sel.selectedIndex].value; xhr.send("id_formations="+idforma); } function go(esp){ 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){ leselect = xhr.responseText; // On se sert de innerHTML pour rajouter les options a la liste avec l'id du select du lieu document.getElementById('lieu_form').innerHTML = leselect; } } // Ici on va voir comment faire du post xhr.open("POST","Ajaxlieu.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 select date sel = document.getElementById('date_form'); iddate = sel.options[sel.selectedIndex].value; xhr.send("id_date="+iddate); } </script>
La partie PHP et HTML de cette même apge liste-deroulante.php :
<form>
<fieldset style="width: 500px">
<legend>Liste liées</legend>
<label>Formation</label>
<select name='formations' id='forma' onchange='go()'>
<option value='-1'>Formations</option>
<?
// Variables de connexion 
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "agilicom";

$connexion = mysql_pconnect($serveur, $admin, $mdp);
$choixbase = mysql_select_db($base, $connexion);

$sql = "SELECT id_formations, nom_formations
		FROM formation
		ORDER BY nom_formations";
$res = mysql_query ($sql) or die ("Exécution de la requête impossible");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row['id_formations']."'>".$row['nom_formations']."</option>";
}
?>
</select>
<label>Date</label>
<div id='date_format' style='display:inline'>
<select name='date_formation' id="date_form" onchange="go('te')">
<option value='-1'>Date</option>
</select>
</div>
<label>Lieu</label>
<div id='lieu_format' style='display:inline'>
<select name='lieu_formation' id="lieu_form">
<option value='-1'>Lieu</option>
</select>
</div>
</fieldset>
</form>
La page appelée pour les dates Ajaxdate.php:
<?php
// Connexion à la base de données
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "agilicom";
$connexion = mysql_pconnect($serveur, $admin, $mdp);
$choixbase = mysql_select_db($base, $connexion);

// Affichage de la date
echo "<select name='date_formation' id='date_form' onchange=\"go('te')\">";
if(isset($_POST["id_formations"])){


$res = mysql_query("SELECT*
					FROM date_formations
					WHERE id_formations=".$_POST['id_formations']."
					ORDER BY date_date");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row["date_date"]."'>".$row["date_date"]."</option>";
}
}
else
echo "<option value='-1'>Choisir une date</option>";
echo "</select>";
?>
La page appelée pour les lieux Ajaxlieu.php:
<?php
// Connexion à la base de données
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "agilicom";
$connexion = mysql_pconnect($serveur, $admin, $mdp);
$choixbase = mysql_select_db($base, $connexion);

// Affichage du lieu
echo "<select name='lieu_formation'>";
if(isset($_POST["id_date"])){

$res = mysql_query("SELECT*
					FROM date_formations
					WHERE id_date=".$_POST['id_date']."
					ORDER BY lieu_date");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row["lieu_date"]."'>".$row["lieu_date"]."</option>";
}
}
else
echo "<option value='-1'>Choisir un lieu</option>";
echo "</select>";

?>

Eléphanteau du PHP | 15 Messages

24 juin 2007, 14:03

Bon ben désolé mais je n'ai pas compris ce code et malheureusement je dois avancer dans mon projet. Je remercie Sadeq de m'avoir aidé et d'avoir pris de son temps mais j'ai encore trop de lacunes. Je le garde de côté pour d'ici quelque temps. Encore merci et peut-être à bientôt !

Eléphanteau du PHP | 15 Messages

27 juin 2007, 20:04

Bonjour,

Me revoilà ! Je me galère toujours depuis deux semaines à trouver une solution pour 3 listes déroulantes. Je croyais que mon problème était résolu mais non ! C'est très important pour moi, je suis toute seule et personne pour m'aider. Je lis des tutoriaux toute la journée mais j'ai du mal à tout saisir. J'ai repris le code sur les livres et auteurs http://siddh.developpez.com/articles/ajax/#LIV-A. D'ailleurs qui est un excellent tutorial.
J'ai voulu rajouter une 3ème liste, mais malheureusement, elle ne se charge pas.

Je ne demande pas de réponse toute faite, mais comprenez ça fait plus de deux semaines que je suis dessus...S'il-vous-plait de l'aide

Voici une partie de mon formulaire dans lequel il y a mes trois listes déroulantes:
<div id="corps">
<form method="POST" name="formulaire" action="inscription1.php" onsubmit="return validateForm(this)">
<div id="titreForm">Inscription à une formation</div>
<div id="corpForm">
	<fieldset id="formation">
		<legend>Formation</legend>
			<br />
			<p>
				<label for="forma" title="Veuillez sélectionner la formation souhaitée" class="oblig">*Formation souhaitée :</label>
				 <? include 'liste-formations2.php'; ?>
			</p>
			<p>
				<label for="date_forma" title="Veuillez sléectionner la date souhaitée" class="oblig">*Date:</label>
				 <span id="date_form" style='display:inline'>
				 <? include 'liste-dates2.php'; ?>
			
				 </span>
			</p>
			<p>	
				  <label for="ref_forma" title="Veuillez saisir le lieu souhaité" class="oblig">Lieu :</label>
				  <span id="lieu_form" style='display:inline'>
    			<? include 'liste-lieux2.php'; ?>
				 </span>
			</p>

	</fieldset>
Voici mes fonctions AJAX :

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; } ///// relation formation-date ////// /** * Méthode qui sera appelée sur le click du bouton */ function getDatte(){ 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){ leselect = xhr.responseText; // On se sert de innerHTML pour rajouter les options a la liste en utilisant l'id du span document.getElementById('date_form').innerHTML = leselect; } } // Ici on va voir comment faire du post xhr.open("POST","liste-dates2.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 select de la formation sel = document.getElementById('formations'); idForma = sel.options[sel.selectedIndex].value; xhr.send("id_formations="+idForma); } ///// relation date-lieu ////// /** * Méthode qui sera appelée sur le click du bouton */ function getLieu(){ 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){ leselect = xhr.responseText; // On se sert de innerHTML pour rajouter les options a la liste en utilisant l'id du span document.getElementById('lieu_form').innerHTML = leselect; } } // Ici on va voir comment faire du post xhr.open("POST","liste-lieux2.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 select de la date sel = document.getElementById('date_for'); idDatte = sel.options[sel.selectedIndex].value; xhr.send("id_date="+idDatte); }

Puis ma page liste-formations2.php :
<?PHP
// include("connexionbd.php");
// Variables de connexion : ajustez ces paramètres selon votre propre environnement 
/* */$serveur = "localhost";
$user   = "root";
$mdp     = "";
$base    = "agilicom"; 

$connexion = mysql_connect($serveur, $user, $mdp) or die ("Connexion au serveur impossible");
if (!$connexion) {
	die('Could not connect: ' . mysql_error());
}
$choixbase = mysql_select_db($base, $connexion);
?>

<select name='forma' id='formations' onchange='getDatte()'>
<option value='-1'>Formations</option>
<?php
$sql = "SELECT id_formations, nom_formations
		FROM formation
		ORDER BY nom_formations";
$res = mysql_query ($sql) or die ("Exécution de la requête impossible");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row['id_formations']."'>".$row['nom_formations']."</option>";
}
?>
</select>

Ma page liste-dates2.php :
<?PHP
// include("connexionbd.php");
// Variables de connexion : ajustez ces paramètres selon votre propre environnement 
/* */$serveur = "localhost";
$user   = "root";
$mdp     = "";
$base    = "agilicom"; 

echo "<select name='date_formation' id='date_for' onchange='getLieu()'>";
if(isset($_POST["id_formations"])){

$connexion = mysql_connect($serveur, $user, $mdp) or die ("Connexion au serveur impossible");
if (!$connexion) {
	die('Could not connect: ' . mysql_error());
}

$choixbase = mysql_select_db($base, $connexion);

$res = mysql_query("SELECT*
					FROM date_formations
					WHERE id_formations= '".$_POST["id_formations"]."'
					ORDER BY date_date");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row["id_date"]."'>".$row["date_date"]."</option>";
}
}
else
echo "<option value='-1'>Choisir une date</option>";
echo "</select>";


?>
Enfin ma page liste-lieux2.php :
<?PHP
// include("connexionbd.php");
// Variables de connexion : ajustez ces paramètres selon votre propre environnement 
/* */$serveur = "localhost";
$user   = "root";
$mdp     = "";
$base    = "agilicom"; 



	// Affichage du lieu
echo "<select name='lieu_formation'>";
if(isset($_POST["id_formations"])&& isset($_POST["id_date"])){


$connexion = mysql_connect($serveur, $user, $mdp) or die ("Connexion au serveur impossible");
if (!$connexion) {
	die('Could not connect: ' . mysql_error());
}
$choixbase = mysql_select_db($base, $connexion);

$res = mysql_query("SELECT*
					FROM date_formations
					WHERE id_formations='".$_POST["id_formations"]."'
					AND id_date='".$_POST["id_date"]."'
					ORDER BY lieu_date");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row["id_date"]."'>".$row["lieu_date"]."</option>";
}
}
else
echo "<option value='-1'>Choisir un lieu</option>";
echo "</select>";

?>

Please help me !

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2007, 23:03

C'est normal que ça ne marche pas, le programme "liste_lieux2.php" attend 2 paramètres dans $_POST: l'id_formations et l'id_date alors que toi tu lui passe seulement un seul paramètre (id_date) dans la fonction AJAX.
xhr.send("id_date="+idDatte);
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 15 Messages

28 juin 2007, 10:28

Bah oui..Quand j'ai dit que je suis bête ! Bon alors ça marche mieux..Encore une fois merci Sadeq...Mais j'ai encore un souci : lorsque je sélectionne une formation, ça me met direct la date, et non <-- choisir une date -->, ce qui fait que le lieu ne change que si j'ai plusieurs dates et que je clique sur une autre de ses dates, si je n'ai qu'une date alors le lieu ne change pas...Faut que je continue à chercher...
Au fait voilà ce que j'ai modifié :

Code : Tout sélectionner

sel = document.getElementById('date_for'); idDatte = sel.options[sel.selectedIndex].value; var data = ("id_formations="+idForma+"&id_date="+idDatte) ; xhr.send(data);

Après quelques heures de recherches....Mes trois listes fonctionnent !!! J'ai changé la place de l'option avec valeur null dans la page liste-dates.php :
<select name='date_formation' id='date_for' onchange='getLieu()'>
<option value='null'>Choisir une date</option>
<?php 
if(isset($_POST["id_formations"])){


$res = mysql_query("SELECT*
					FROM date_formations
					WHERE id_formations= '".$_POST["id_formations"]."'
					ORDER BY date_date");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row["id_date"]."'>".$row["date_date"]."</option>";
}
}?>
</select>
Maintenant il me reste un souci, je ne récupère pas la valeur de ma liste formation car dans mon formulaire ce champ doit être rempli et j'ai la page de validation qui m'indique que je n'ai pas saisi de formation...Je continue à chercher...Question d'habitude ![/php]



J'ai trouvé mon erreur ! Il me reste encore du boulot car maintenant je ne reçois plus mon formulaire par mail..Mais bon on peut dire que le sujet est résolu. Merci à Sadeq de son aide !