|
|
|
|
Bonjour,
J'ai un petit problème de listes déroulantes. J'ai beau cherché sur différents forums je ne trouve pas la réponse à ma question.
J'ai 2 listes déroulantes ('familles' et 'sous-familles') issues directement des tables de même nom de ma base Mysql.
Comme leur nom l'indique, les listes sous-familles et familles sont liées.
Je voudrais pouvoir sélectionner une famille, puis une sous-famille et de là, je voudrais faire apparaitre tous les articles de la sous-famille sélectionnée.
Bref, mes deux listes sont bien alimentées et si je sélectionne une 'famille', la liste 'sous_familles' se met à jour (j'ai vu cette technique sur un forum qui parlé d'AJAX).
De même, si je choisis une 'sous-famille', les 'articles' de celle-ci apparaissent à la suite.
Mais là où ça se gâte, c'est si je sélectionne une famille, les modifications sur la liste sous-familles n'ont plus d'incidence, pas d'apparition des articles.
J'ai un fichier selection.php où se trouve le code js ainsi que mes deux listes déroulantes et l'emplacement pour l'aperçu des articles.
Ma première liste, via la fonction sendData envoie la famille sélectionnée au fichier ajaxssf.php pour modifier la liste sous-famille.
La deuxième envoie, toujours par sendData, la sous-famille sélectionnée au fichier ajaxart.php pour afficher les
articles correspondants.
Les fichiers ajaxssf et ajaxart n'ont pas la même en-tête que le fichier principal, pas de JS, seulement un header('Content-type: text').
A mon avisde débutant, aussi humble soit-il, ma fonction sendData (tirée d'un tuto et adaptée à mon cas) de mon code js marche, puisque j'arrive à la faire fonctionner autant de fois que je veux,
si je change mon choix sur la même liste.
Je pense que mon problème vient du fichier ajaxssf.php (appelé lorsqu'on change la famille), où j'utilise toujours la même fonction (sendData), mais j'ai l'impression qu'elle n'est pas reconnue.
Je n'ai sans doute pas compris les subtilités de la méthode que j'ai utilisée, car apparament, je ne sais pas ce qu'il se passe exactement comme échange.
PS: je n'ai pas mis mon code, mais si ça peut vous être utile, je peux le poster.
si quelqu'un a lu ce post en entier, je l'en remercie, c'est déjà un grand mal.
si quelqu'un a compris, je l'en félicite.
si quelqu'un a une idée, je le solicite.
si quelqu'un a des questions, n'hésite pas.
Merci d'avance. Loran.
Désolé pour le calvère de ceux qui m'ont lu jusqu'au bout. Je viens de trouvre la solution à mon problème en ne faisant pas appel à ma fonction depuis ma page ajaxssf.php, mais directement depuis ma page principale 'selection.php'
|
Bonjour ioran
|
Désolé Jean-François
|
J'ai 3 tables : impact, processus, instancededecision.
|
Je n'ai pas trop le temps alors je te donne les codes exemple que j'ai pour deux listes : inspires toi en et adaptes en analysant le principe, tu verras ce n'est pas tjs facile à debugger mais une fois que ça marche Ajax c'est de la "balle"! si besoin decommente la boite alert() dans la fct traitement de la réponse pour voir ce que répond PHP.
<?php $host="localhost"; $Login="root"; $Pass="......l"; $DB="test"; $Table="etudiants"; $champ_niv="niveau"; $champ_etud="etudiants"; ?> liste_liees.php: <html>
<head>
<!-- Script de listes deroulantes liees avec appel par AJAX, (evite le rechargement de la page) -->
<script language="Javascript"type="text/JavaScript">
// Requette AJAX
function makeRequest(url,id_niveau,id_ecrire){
var http_request = false;
//créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Abandon :( Impossible de créer une instance XMLHTTP');
return false;
}
http_request.onreadystatechange = function() { traitementReponse(http_request,id_ecrire); } //affectation fonction appelée qd on recevra la reponse
// lancement de la requete
http_request.open('POST', url, true);
//changer le type MIME de la requête pour envoyer des données avec la méthode POST , !!!! cette ligne doit etre absolument apres http_request.open('POST'....
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
obj=document.getElementById(id_niveau);
data="val_sel="+obj.value;
http_request.send(data);
}
function traitementReponse(http_request,id_ecrire) {
var affich="";
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// cas avec reponse de PHP en mode texte:
//chargement des elements reçus dans la liste
var affich_list=http_request.responseText;
//alert("Reponse de php: "+affich_list);
obj = document.getElementById(id_ecrire);
obj.innerHTML = affich_list;
}
else {
alert('Un problème est survenu avec la requête.');
}
}
}
</script>
</head>
<?php
include ("config.php");
// Connexion a la base de donnees
$AccesBase = mysql_connect($host,$Login,$Pass);
mysql_select_db($DB,$AccesBase);
$QuestionBase = "SELECT DISTINCT $champ_niv FROM $Table ORDER BY $champ_niv ASC " ;
$result_recherche=mysql_db_query($DB, $QuestionBase) or die (mysql_error());
$nombre_enr=mysql_num_rows($result_recherche);
?>
<body>
<form name="test1" method="post" action="liste_liees.php" >
<div id="id_list1">Niveau:<br>
<select name="niv1" id="id_niv1" onChange="makeRequest('rep_PhpAjax.php','id_niv1','id_list2')">
<option>-- Choisissez --</option>
<?php
while ($row=mysql_fetch_assoc($result_recherche)){
?>
<option value="<?php echo $row[$champ_niv]?>"><?php echo $row[$champ_niv]?></option>
<?php
}
?>
</select>
<br><br>
</div>
<div id="id_list2">
<!-- ici sera charge la reponse mode texte de PHP à la request AJAX -->
</div>
</form>
</body>
</html>
repPhpAjax.php: <?php
// script PHP interrogation Base de donnees pour reponse a la requette AJAX
include ("config.php");
// Connexion a la base de donnees
$AccesBase = mysql_connect($host,$Login,$Pass);
mysql_select_db($DB,$AccesBase);
$QuestionBase = "SELECT * FROM $Table WHERE ".$champ_niv."='".$_POST[val_sel]."' ORDER BY ".$champ_etud." ASC " ;
$result_recherche=mysql_db_query($DB, $QuestionBase) or die (mysql_error());
// construction de la liste deroulante
$aff=="";
$aff=$aff."Etudiants:<br>
<select name='niv1' id='cont_list2' >
<option>-- Choisissez --</option>";
while ($row=mysql_fetch_assoc($result_recherche)){
$aff.="<option value=\"$row[$champ_etud]\">$row[$champ_etud]</option>";
}
$aff=$aff."</select><br><br>";
// envoi reponse Php a Ajax
echo $aff;
?>Configuration: Windows XP Firefox 2.0.0.6 |
Je suis revenu de mon rendez vous, j'ai eu un peu de temps alors je t'ai fait tes scripts pour ce dont tu as besoin:
<?php $host="localhost"; $Login="xxxxxxx"; $Pass="yyyyyyyy"; $DB="gest_process"; // le nom de ta base ?> page1.php: <html>
<head>
<!-- Script de listes deroulantes liees avec appel par AJAX, (evite le rechargement de la page) -->
<script language="Javascript"type="text/JavaScript">
// Requette AJAX
function makeRequest(url,id_niveau,id_ecrire){
var http_request = false;
//créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Abandon :( Impossible de créer une instance XMLHTTP');
return false;
}
http_request.onreadystatechange = function() { traitementReponse(http_request,id_ecrire); } //affectation fonction appelée qd on recevra la reponse
// lancement de la requete
http_request.open('POST', url, true);
//changer le type MIME de la requête pour envoyer des données avec la méthode POST , !!!! cette ligne doit etre absolument apres http_request.open('POST'....
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
obj=document.getElementById(id_niveau);
data="val_sel="+obj.value;
http_request.send(data);
}
function traitementReponse(http_request,id_ecrire) {
var affich="";
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// cas avec reponse de PHP en mode texte:
//chargement des elements reçus dans la liste
var affich_list=http_request.responseText;
obj = document.getElementById(id_ecrire);
obj.innerHTML = affich_list;
}
else {
alert('Un problème est survenu avec la requête.');
}
}
}
</script>
</head>
<?php
include ("config.php");
// Connexion a la base de donnees
/*$AccesBase = mysql_connect($host,$Login,$Pass);
mysql_select_db($DB,$AccesBase);
$QuestionBase = "SELECT DISTINCT $champ_niv FROM $Table ORDER BY $champ_niv ASC " ;
$result_recherche=mysql_db_query($DB, $QuestionBase) or die (mysql_error());
$nombre_enr=mysql_num_rows($result_recherche);
*/
?>
<body>
<form name="test1" method="post" action="liste_liees.php" >
<div id="id_list1">Liste1:<br>
<select name="niv1" id="id_niv1" onChange="makeRequest('rep_PhpAjax.php','id_niv1','id_niv2')">
<option>-- Choisissez --</option>
<option value="impact">impact</option>
<option value="processus">processus</option>
<option value="instancedecision">instance decision</option>
</select>
<br><br>
</div>
<div id="id_niv2">
<!-- ici sera charge la reponse mode texte de PHP à la request AJAX -->
</div>
</form>
</body>
</html>
repPhpAjax.php: <?php
// script PHP interrogation Base de donnees pour reponse a la requette AJAX
include ("config.php");
//recup de la valeur postee par Ajax (nom de la table)
$table=$_POST['val_sel'];
if($table=="Choisissez") {exit;}
//generation des noms des champs en fonction de la table (si ils s'appelaient tous pareils il serait inutile de faire ça)
switch ($table){
case "impact":
$id="id_impact";
$nom="LibelleImpact";
break;
case "instancedecision":
$id="Id_Instance_Decision";
$nom="Nom";
break;
case "processus":
$id="Id_Processus";
$nom="NomProcessus";
break;
}
// Connexion a la base de donnees
$AccesBase = mysql_connect($host,$Login,$Pass);
mysql_select_db($DB,$AccesBase);
$QuestionBase = "SELECT * FROM $table " ;
$result_recherche=mysql_db_query($DB, $QuestionBase) or die (mysql_error());
// construction de la réponse PHP à Ajax
$aff="<table BORDER=\"6\" CELLPADDING=\"6\" CELLSPACING=\"10\" Width=\"60%\">";
$aff.="<tr><th Width=\"60%\">Nom</th><th colspan=\"2\"Width=\"40%\">Actif</th></tr>";// ligne des titres du tableau
while ($row=mysql_fetch_assoc($result_recherche)){
//cocher le bouton radio en focntion de l'etat Actif oui/non lu dans la base
if($row['Actif']=="oui"){$check_oui="checked"; $check_non="";}else{$check_oui=""; $check_non="checked";}
// generation des lignes de la reponse
$aff.="<tr><td><input type=\"text\" name=\"$row[$id]\" value=\"$row[$nom]\"></td>";
$aff.="<td><input type=\"radio\" name=\"radio_oui_$row[$id]\" $check_oui >oui</td>";
$aff.="<td><input type=\"radio\" name=\"radio_non_$row[$id]\" $check_non >non</td></tr>";
}
$aff.="</table>";
// envoi reponse Php a Ajax qui va afficher tout ça dans la page
echo $aff;
?>Configuration: Windows XP Firefox 2.0.0.6 |
Bonjour,
|
Coucou c'est moi qui reviens de la campagne.
Configuration: Windows XP Firefox 2.0.0.6 |
Coucou,
|
Première question:
Configuration: Windows XP Firefox 2.0.0.6 |
En fait qd j'ai essayé les trois fichiers que tu m'as donné en renommant seulement le fichier repPhpAjax.php en rep_PhpAjax.php et en mettant bien sur tes codes d'accès à la base ça fonctionnait.
|
Précises moi:
Configuration: Windows XP Firefox 2.0.0.6 |
BONJOUR,
|
S@alut,
Configuration: Windows XP Firefox 2.0.0.6 |