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] <select> Client et <select> Projets lié


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut [AJAX] <select> Client et <select> Projets lié
    Bonsoir,

    je souhaiterai réaliser un petit outil fonctionnel sur une interface d'administration, et je me suis dit, plutot que d'envoyer le formulaire, fais le en AJAX.
    Ce que je souhaite faire : Sur une page pour ajouter un screenshot, je dois d'abord choisir le client auquel est lié ce screenshot, puis je dois choisir le projet auquel est lié ce screenshot. Et lorsque je choisis un client dans mon premier <select> (crée via une boucle qui liste ma bdd), je voudrai que le <select> des projets se remplisse tout seul avec la liste des projets, en n'y écrivant que les projets lié au client choisi avant.

    Donc voilà, je suis allé voir quelques tutos, histoire de choper des morceaux de script, et de comprendre un peu en les bidouillant :

    Le formulaire d'ajout de screenshot :

    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
    <form action="screenshots_add.php" name="ajout" method="post" enctype="multipart/form-data">
    	<table width="100%" cellspacing="0" cellpadding="10" class="niv2">
    	  <tr>
    		<td>Client :</td>
    		<td>
    		<select name="client_id" onChange="findProjets(this.value)">
    		<option value="">Choisir le client</option>
    		<?php
                    $sql =  "SELECT client_id, client_entreprise
                                    FROM CLIENTS
                                    ORDER BY client_id";
                    $query = mysql_query($sql);
                    while($result = mysql_fetch_array($query))
                    {
                            echo '<option value="'.$result['client_id'].'">'.$result['client_entreprise'].'</option>';
                    }
                    ?>
    		</select>
    		</td>
    	  </tr>
    	  <tr>
    		<td width="10%">Nom du projet :</td>
    		<td>
    		<?php
                    include 'ajax.php';
                    ?>
    		</td>
    	  </tr>
    	  <tr>
    		<td>Screenshot :</td>
    		<td><input type="file" name="screenshot" size="30" /></td>
    	  </tr>
    	  <tr>
    		<td></td>
    		<td><input type="submit" name="submit" value="Envoyer" style="width:100px;" /></td>
    	  </tr>
    	</table>
    	</form>
    Le fichier ajax.php, que j'inclue là ou devrait apparaitre le <select> des projets :

    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
    <script type="text/javascript">
    function writediv(texte)
    {
    	document.getElementById('pseudobox').innerHTML = texte;
    }
     
    function findProjets(id_client)
    {
    	if(id_client != '')
    	{
     
    		if(texte = file('http://127.0.0.1/Projects/Web%20Spoken/site/admin/find_projets.php?client_id='+id_client))
    			writediv('ça marche');
    	}
    }
     
    function file(fichier)
    {
    	if(window.XMLHttpRequest) // FIREFOX
    		xhr_object = new XMLHttpRequest();
    	else if(window.ActiveXObject) // IE
    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    	else
    		return(false);
    	xhr_object.open("GET", fichier, false);
    	xhr_object.send(null);
    	if(xhr_object.readyState == 4) 
    		return(xhr_object.responseText);
    	else return(false);
    }
    </script>
    <?php
    echo '<select name="projet_id">';
    while($result = mysql_fetch_assoc($query))
    {
            echo '<option value="'.$result['client_id'].'">'.$result['client_entreprise'].'</option>';
    }
    echo '</select>';
    echo '<div id="pseudobox"></div>';
    ?>
    Et enfin, le fichier findProjets.php, que je demande de lire via le Javascript, dans la fonction findProjets() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    include 'header.php';
     
    // ON CHERCHE LES PROJETS DE CE CLIENT
    $sql =  "SELECT projet_id, projet_nom 
                    FROM projets 
                    WHERE projet_client_id = '".$_GET['client_id']."'"
    $query = mysql_query($sql);
    ?>
    Résultat : Une fois que je selectionne un client, le <div> avec écrit 'ça marche' apparait. Mais le <select> des projets ne se rempli pas.

    Qu'est ce qui ne va pas dans mes scripts ?

    (pour info, j'ai bien des clients et des projets liés à ces clients dans ma table, le problème ne vient pas de là).

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    salut,

    si j'ai bien compris, tu veux choisir dans un premier select un client, et qu'en fonction de ton choix le deuxième select contienne une liste correspondante ?

    pourquoi la page contenant le formulaire ne génèretait-elle pas directement les différentes listes possibles pour le second select en fonction de tous les idClient trouvés en remplissant le premier (via un script PHP je parle)...
    ainsi, une fois ta page de formulaire chargé, ta page contient tout ce dont elle a besoin, une simple fonction javascript remplit ensuite le 2nd select...

    sinon, si tu veux rester sur un principe de génération en live de la liste du 2nd select, il me semble que tu démultiplies un peu trop les fichiers (notamment imbriqués les uns dans les autres) et les fonctions... je pense qu'on peut simplifier, je réfléchis à la chose et reposterai un bout de code d'ici peu
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Effectivement c'est tout à fait ce que je veux faire.

    Effectivement ça serait possible de simplifier, et que le fichier soit généré avec tout ce qu'il faut direct. mais j'ai saisi cette occasion pour me lancer dans l'AJAX, car c'est un cas quand même assez facile.

    Si effectivement tu pouvais me trouver une solution (je demande pas le script deja tout fait, mais simplement de mettre en avant mes erreurs), ca serait vraiment super.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    bonjour,

    je viens de mieux regarder ton code... ce que tu constates est tout à fait normal, puisque lorsque tu inclues ton fichier ajax.php, le code js est chargé (et exécutable) et la partie php (pour remplir le second select) est interprété (donc sans id client !)...

    tu es bien pourtant bien parti avec le remplissage de ton premier select.

    Ton formulaire modifié :
    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
    <html><head>
    <script type="text/javascript">
    function file(fichier)
    {
    	if(window.XMLHttpRequest) // FIREFOX
    		xhr_object = new XMLHttpRequest();
    	else if(window.ActiveXObject) // IE
    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    	else
    		return(false);
    	xhr_object.open("GET", fichier, false);
    	xhr_object.onReadyStateChange{
                      if(xhr_object.readyState == 4) document.getElementById('select_projet').innerHTML = xhr_object.responseText;
    	      else document.getElementById('pseudobox').innerHTML = 'listing des projets en cours...';
                      }
                 xhr_object.send(null);
     
    }
    </script>
    </head>
    <body>
    <form action="screenshots_add.php" name="ajout" method="post" enctype="multipart/form-data">
    	<table width="100%" cellspacing="0" cellpadding="10" class="niv2">
    	  <tr>
    		<td>Client :</td>
    		<td>
    		<select name="client_id" onChange="file('http://127.0.0.1/Projects/Web%20Spoken/site/admin/find_projets.php?client_id='+this.value);">
    		<option value="">Choisir le client</option>
    		<?php
                    $sql =  "SELECT client_id, client_entreprise
                                    FROM CLIENTS
                                    ORDER BY client_id";
                    $query = mysql_query($sql);
                    while($result = mysql_fetch_array($query))
                    {
                            echo '<option value="'.$result['client_id'].'">'.$result['client_entreprise'].'</option>';
                    }
                    ?>
    		</select>
    		</td>
    	  </tr>
    	  <tr>
    		<td width="10%">Nom du projet :</td>
    		<td>
    		<select name="select_projet" disabled='disabled'></select>
    		<div id="pseudobox"></div></td>
    	  </tr>
    	  <tr>
    		<td>Screenshot :</td>
    		<td><input type="file" name="screenshot" size="30" /></td>
    	  </tr>
    	  <tr>
    		<td></td>
    		<td><input type="submit" name="submit" value="Envoyer" style="width:100px;" /></td>
    	  </tr>
    	</table>
    	</form></body></html>
    ton fichier ajax.php ne contiendra alors plus que la fonction de rechreche dans ta bdd et l'echo de retour, comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $sql =  "SELECT projet_id, projet_entreprise
                                    FROM CLIENTS 
                                    ORDER BY projet_id 
                                    WHERE client_id=$client_id";
                    $query = mysql_query($sql);
                    
    while($result = mysql_fetch_assoc($query))
    {
            echo '<option value="'.$result['projet_id'].'">'.$result['projet_entreprise'].'</option>';
    }
    ?>
    ******
    petit edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <tr>
    		<td width="10%">Nom du projet :</td>
    		<td>
    		<select name="select_projet" disabled='disabled'></select>
    		<div id="pseudobox"></div></td>
    	  </tr>
    à modifier par, 1ere option :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <tr>
    		<td width="10%">Nom du projet :</td>
    		<td>
    		<div id="select projet"></div></td>
    	  </tr>
    donc ajax.php devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $sql =  "SELECT projet_id, projet_entreprise
                                    FROM CLIENTS 
                                    ORDER BY projet_id 
                                    WHERE client_id=$client_id";
                    $query = mysql_query($sql);
    echo "<select name="select_projet" disabled='disabled'>";
    while($result = mysql_fetch_assoc($query))
    {
            echo '<option value="'.$result['projet_id'].'">'.$result['projet_entreprise'].'</option>';
    }
    echo "</select>";
    ?>

    ou par, 2eme option :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <tr>
    		<td width="10%">Nom du projet :</td>
    		<td>
    		<select name="select_projet" disabled='disabled'>
    <option value="">Choisir le projet</option>
    </select>
    	  </tr>
    donc ajax.php devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    $sql =  "SELECT projet_id, projet_entreprise
                                    FROM CLIENTS 
                                    ORDER BY projet_id 
                                    WHERE client_id=$client_id";
                    $query = mysql_query($sql);
    $a=1;
    while($result = mysql_fetch_assoc($query))
    {
            echo "document.form[0].elements['select_projet'].options[".$a."] = new Option('".$result['projet_entreprise']."','".$result['projet_id']."');";
    $a++;
    }
    echo "document.form[0].elements['select_projet'].disabled = false;";
    ?>

    et dans la fonction file() on aura :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    xhr_object.onReadyStateChange{
                      if(xhr_object.readyState == 4) eval(xhr_object.responseText);
    	      }
    => la deuxième méthode me parait plus intéressante puisque le champ select sera afficher des le départ, mais en grisé tant qu'un client n'a pa été sélectionné ! j'ai zappé le message d'attente dans la deuxieme méthode mais on peut très facilement le rajouter
    le code est à tester, il y a peut-êter quelques bugs à corriger (dsl), d'autant que c'est la première fois que j'utilise éval...

    tiens moi au courant
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Bon, pas mal d'heures de travail dessus, et ça ne marche toujours pas.

    Il semblerait que le script boude la ligne du xhr_object.open("GET", fichier, true);
    comme tu peux le voir, à coté du deuxieme select, j'ecris le ReadyState du script, il est toujours sur 1 (qui correspond à l'envoi des données). J'ai fait d'autres tests (avec des alerts), l'id du premier select est bien envoyé vers la requete. Et la requete semble elle aussi être correcte. Vois-tu ce qui cloche ?

    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
    <script type="text/javascript">
    	function file(fichier)
    	{
    		var xhr_object = null;
    		if(window.XMLHttpRequest) 		// FIREFOX
    			xhr_object = new XMLHttpRequest();
    		else if(window.ActiveXObject) 	// IE
    			xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    		else  							// XMLHttpRequest non supporté par le navigateur
            	alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    		xhr_object.open("GET", fichier, true);
    		xhr_object.onReadyStateChange
    		{
    			if(xhr_object.readyState == 4)
    			{
    				document.getElementById('select_projet').innerHTML = xhr_object.responseText;
    			}
    			else 
    			{
    				document.getElementById('pseudobox').innerHTML = 'listing des projets en cours : ReadyState = '+xhr_object.readyState;
    			}
    		}
    		xhr_object.send(null);	
    	}
     
    	</script>
    	<form action="screenshots_add.php" name="ajout" method="">
    	<table width="100%" cellspacing="0" cellpadding="10" class="niv2">
    	  <tr>
    		<td>Client :</td>
    		<td>
    		<select name="client_id" onChange="file('ajax.php?client_id='+this.value);">
    		<option value="">Choisir le client</option>
    		<?php
                    $sql =  "SELECT client_id, client_entreprise
                                    FROM CLIENTS
                                    ORDER BY client_id";
                    $query = mysql_query($sql);
                    while($result = mysql_fetch_array($query))
                    {
                            echo '<option value="'.$result['client_id'].'">'.$result['client_entreprise'].'</option>';
                    }
                    ?>
    		</select>
    		</td>
    	  </tr>
    	  <tr>
    		<td>Nom du projet :</td>
    		<td>
    		<select name="select_projet">
    		<option value="">Choisir le projet</option>
    		</select>
    		<span id="pseudobox"></span>
    		</td>
    	  </tr>

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    slt,

    si le readystate t'affiche 1, c'est que la ligne que tu mentionnes n'est pas ignorée... mais la comme ca je ne vois pas...

    faudrait que tu fasse un alert sur la variable "fichier" et voir ce qu'il t'affiche, je pense que ca vient de la et du coup il progresse pas pck il bug... ou alors c'est tout simplement au niveau du fichier php...

    tiens moi au courant et je regarde aussi de mon coté
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert('fichier : '+fichier);
    en fin de fonction me sort ce qui est attendu, c'est à dire
    fichier : ajax.php?client_id=1 (ou 2 suivant ce que je choisis dans le select)
    Comment puis-je afficher la requete sql ? un dans le fichier ajax.php ne m'affiche rien. A mon avis parce que je suis encore dans le script JS au moment de cet echo. Il faudrait que j'arrive à afficher les variables $sql, et $result de mon fichier php, mais je ne sais pas bien comment m'y prendre pour les faire sortir du script JS.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    re,

    test ton fichier ajax.php en faisant un appel direct dessus...

    cad que dans ta barre d'adresse tu tapes directement ajax.php?client_id=1 ; étant donné que tu sais ce qu'il est sensé te retourné tu vas pouvoir voir si ca vient de là... tu pourras aussi y intégrer des écho des différentes variables pour tester...

    il faudrait s'assurer dans un premier temps que ajax.php effectue bien le travail demander en retournant ce qu'on attend... une fois cette étape accomplie il nous restera à se concentrer sur le code js si ca bug toujours...

    met moi en PJ tes deux fichiers stp, ça m'évitera de tout retaper et de voir exactement ce que tu as...

    courage on va y arriver
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Alors, je viens de browse le fichier ajax.php?client_id=1, il semble fonctionner comme attendu, il m'écrit
    document.form[0].elements['select_projet'].options[1] = new Option('Nom du projet','1');
    donc ça c'est bon. Le problème est donc bien au niveau du JS, et de l'interprétation de ce résultat.

    Voici les deux fichiers en pièces jointes, comme demandé.

    (Je ne pourrai pas faire de modif pendant tout le week end, car je ne serai pas sur mon PC de travail, mais je ne manquerai pas de venir jeter un coup d'oeil sur le thread voir si tu as eu une idée de génie :p )

    Encore merci infinimiment pour le temps que tu consacres à ce problème : )
    Fichiers attachés Fichiers attachés

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Les états de readyState sont les suivants (seul le dernier est vraiment utile):
    0: non initialisé.
    1: connexion établie.
    2: requête reçue.
    3: réponse en cours.
    4: terminé.

    donc si ca reste sur 1, cela signifie que la requête n'est pas recue... il faut chercher le pourquoi...

    *****
    edit :
    je viens de trouver une erreur au niveau de l'appel de la fonction de callback, j'ai modifié le code et je te renvois la page

    screenshots_add.php
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Hello,
    je viens de voir l'erreur (le function () manquant) et je l'avais notée aussi.

    J'ai pu en fait avoir accès à un pc ce week end et je viens d'installer le necessaire pour travailler. Après test, cela ne change hélas rien, je dirai même que c'est pire car le innerHTML du getElementByid('pseudobox') (le petit span en bas donc) ne s'affiche plus.

    Selon moi : le fichier ajax.php renvoie bien ce qu'on lui demande, mais peut être que le script JS ne peut pas le comprendre comme tel. J'ai fait un test avec un lien qui permet d'ajouter des <option> manuellement, à partir du fichier principal, et cela fonctionne, le <select> s'incrémente, mais j'ai dû changer quelques trucs à ta ligne JS générée par le fichier ajax.php :

    J'ai changé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.form[0].elements['select_projet'].options[".$a."] = new Option('".$result['projet_entreprise']."','".$result['projet_id']."');
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.forms.ajout.select_projet.options[document.forms.ajout.select_projet.options.length] = new Option('texte','value');
    Avec ceci, la fonction manuelle du lien fonctionne, mais lorsque je demande à ajax.php de me générer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "document.forms.ajout.select_projet.options[document.forms.ajout.select_projet.options.length] = new Option('".$result_ajaxed['projet_nom']."', '".$result_ajaxed['projet_id']."');";
    , cela ne marche toujours pas.

    Donc pour moi, le problème vient clairement du fait que JS n'arrive pas à comprendre ce que lui retourne ajax.php

    Qu'en penses-tu ? J'espère avoir été à peu près clair sur les tests que je viens de faire.

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    bon je viens de mettre en place le même principe que ce que tu essayes de faire sur un site que je suis en train de faire... et ca marche nickel ! j'ai comparé tes fichiers aux miens, et je ne crois pas que le problème vienne du js...

    je me suis penché sur la partie php de ton code, et là en revanche j'ai trouvé une grosse erreur !
    tu code quelquechose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?
    ...
    else{
    ?>
    <script>...</script>
    <?
    }
    ?>
    cela ne signifie pas du tout que le code js est dans le else !!!

    je t'ai fait quelque modifs sur les deux fichiers (notamment renvoi du js dans la partie <head> !)

    vois si ca marche... si tel n'est pas le cas, je te ferais passé mes deux pages pour que tu puisses toi aussi comparé de ton coté et trouvé
    Fichiers attachés Fichiers attachés
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Toujours pas d'amélioration de mon coté :

    J'ai modifié le script en mettant quelques alert() :

    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
    xhr_object.open("GET", fichier, true);
    	alert('test 01');
    	xhr_object.onReadyStateChange = function()
    	{
    		alert('test 02');
    		if(xhr_object.readyState == 4)
    		{
    			alert('readystate = 4 !');
    			if(xhr_object.status == 200)
    				eval(xhr_object.responseText);
    			else 
    				alert("Erreur, status = "+xhr_object.status);
    		}
    		else 
    			document.getElementById('pseudobox').innerHTML = 'listing des projets en cours : ReadyState = '+xhr_object.readyState;
    	}
    	xhr_object.send(null);
    Il m'affiche l'alert('test 01'), mais pas l'alert('test 02'), donc il bloque sur le changement d'état, encore et toujours.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    tintin !

    Et voilà, ça fonctionne. Je me suis inspiré d'un tuto trouvé sur la toile, EDIT : et après quelques retouches, ça fonctionne.

    Hélas, je n'ai pas trouvé les erreurs/différences entre le script que l'on a crée, et celui ci : /

    Je te le recopie, cela pourra toujours te servir :

    la partie JS, dans le head :
    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
    <script type="text/javascript">
    var requete = null;
     
    function creerXHR()
    {
        if(window.XMLHttpRequest) 		// FIREFOX
    		xhr_object = new XMLHttpRequest();
    	else if(window.ActiveXObject) 	// IE
    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    	else  							// XMLHttpRequest non supporté par le navigateur
    		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    }
     
    function getProjets(id_client)
    {
    	if(id_client == 'vide')
    		document.getElementById('blocDepartements').innerHTML = '';
    	else
    	{
    		var etat = document.getElementById('etat');
    		etat.innerHTML = "Traitement en cours, veuillez patienter...";
     
    		creerXHR();
     
    		var url = 'ajax.php?client_id='+ id_client;
     
    		xhr_object.open('GET', url, true);
     
    		xhr_object.onreadystatechange = function()
    		{
    			/* Lorsque l'état est à 4 */
    			if(xhr_object.readyState == 4)
    			{
    				/* Si on a un statut à 200 */
    				if(xhr_object.status == 200)
    				{
    					/* Mise à jour de l'affichage, on appelle la fonction apropriée */
    					eval(xhr_object.responseText);
    					etat.innerHTML = "";
    				}
    			}
    		}
    		xhr_object.send(null);
        }
    } 
    </script>
    Le formulaire (j'ai gardé ton idée d'avoir tout le temps le deuxieme select apparent, et qu'il se remplisse, plutot que de le faire apparaitre une fois généré, comme le fait le tuto) :

    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
    <form action="screenshots_add.php" name="ajout" id="ajout" method="post">
    	<table width="100%" cellspacing="0" cellpadding="10" class="niv2">
    	  <tr>
    		<td>Client :</td>
    		<td>
    		<select name="client_id" onChange="getProjets(this.value);">
    		<option value="">Choisir le client</option>
    		<?php
                    $sql =  "SELECT client_id, client_entreprise
                                    FROM CLIENTS
                                    ORDER BY client_id";
                    $query = mysql_query($sql);
                    while($result = mysql_fetch_array($query))
                    {
                            echo '<option value="'.$result['client_id'].'">'.$result['client_entreprise'].'</option>';
                    }
                    ?>
    		</select>
    		</td>
    	  </tr>
    	  <tr>
    		<td>Nom du projet :</td>
    		<td>
    		<select name="select_projet"  id="select_projet">
    		<option value="">Choisir le projet</option>
    		</select>
    		<span id="etat"></span>
    		</td>
    	  </tr>
    		<td>Screenshot :</td>
    		<td><input type="file" name="screenshot" size="30" /></td>
    	  </tr>
    	  <tr>
    		<td></td>
    		<td><input type="submit" name="submit" value="Envoyer" style="width:100px;" /></td>
    	  </tr>
    	</table>
    	</form>
    Et le fichier ajax.php, qui fait la requete :
    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
    <?php
    include 'header.php';
     
    $sql_ajaxed =   "SELECT projet_id, projet_nom
                                    FROM PROJETS  
                                    WHERE projet_client_id= '".$_GET['client_id']."'";
    $query_ajaxed = mysql_query($sql_ajaxed) OR die('Erreur : '.mysql_error());
     
    $a=1;
     
    while($result_ajaxed = mysql_fetch_assoc($query_ajaxed))
    {
            echo "document.forms.ajout.select_projet.options[$a] = new Option('".$result_ajaxed['projet_nom']."','".$result_ajaxed['projet_id']."');";
            $a++;
    }
     
    ?>
    Il me reste un petit détail à regler : lorsque je selectionne un client auquel est lié 2 projets, puis que je selectionne un client auquel n'est lié qu'un seul projet, il me laisse l'option #2 du preimer choix dans le select, puisque seul l'option #1 est remplacée. Je devrai pouvoir régler cela assez facilement.

    Voilà c'est fait, une petite fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function viderSelect()
    {
    	while (document.forms.ajout.select_projet.options.length > 1)
    	{
    		document.forms.ajout.select_projet.options[1] = null;
    	}
    }
    Puis un appel de cette fonction au tout debut de la fonction getProjets();

    Encore merci mille fois jeje13009, pour le temps que tu as consacré à ce problème : )

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    pour la derniere fonction, celle que tu as faite pour palier au problème du nombre différents de résultats selon le client... je pense qu'il vaut mieux y palier en supprimant toutes les lignes avant d'évaluer le retour de la nouvelle requete (qui remplira le nombre de ligne dont elle a besoin).

    je te mets en fichier joint mes deux fichiers (comme je te l'avais proposé plus haut)... ca peut toujours être une solution (pour quelqu'un d'aute peut être :d)

    PS : tu as un var requete = null qui ne sert à rien dans ton js

    edit : je viens de virer mes fichiers pck me suis rendu compte qu'il y avait mes codes d'accès le temps de virer les codes et jte les remets
    Conception et hébergement de votre site Web : http://www.jvprod.fr !

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Pas de problème. ne t'inquietes pas, je n'ai pas récupéré l'ancienne version des fichiers : )

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

Discussions similaires

  1. Serveur multi-clients et select()
    Par zouip dans le forum C++
    Réponses: 3
    Dernier message: 16/03/2008, 00h13
  2. Afficher une fiche client par selection dans une Liste
    Par Pascal26 dans le forum WinDev
    Réponses: 2
    Dernier message: 10/04/2007, 11h16
  3. [AJAX] Liste avec si select "autre" ouvre un div pour ajouter option
    Par gandalf76fr dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/11/2006, 15h24
  4. [AJAX] Ajax, formulaire, div et select
    Par n8ken dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/09/2006, 10h51
  5. IO::Select client iteratif
    Par bluecurve dans le forum Modules
    Réponses: 1
    Dernier message: 02/08/2006, 15h40

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