Page 1 sur 1

Disparition d'un élément d'une liste une fois sélectionné ?

Posté : 18 mai 2006, 11:38
par travisbarker
Bonjour à tous !
Je souhaite créer une liste déroulante avec les éléments qui disparaissent une fois qu'on les a sélectionnés.
Pour l'instant j'ai ça :

Code : Tout sélectionner

<select name="numero"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> </select>
En fait je fais une application pour créer les joueurs d'une équipe de foot où l'utilisateur entre les noms, prénoms, et numéros de chaque joueur.
es infos sont ajoutées à une table de ma base de donné.
Donc je voudrais que si l'utilisateur a choisi un numéro, il ne soit plus attribuable (donc plus disponible dans la liste).

C'est possible à faire ?
Ou je dois trouver une autre solution ? (changement de couleur des numéros déja sélectionnés ? liste avec les numéros déja pris à côté ?)

Merci d'avance pour le coup de main !

Posté : 18 mai 2006, 19:53
par Cyrano
:idea: Suggestion
Ce serait faisable avec une table temporaire où tu aurais la liste complète au départ : tu construis ta liste et si tu sélectionnes une ligne, tu la supprimes de la table temporaire puis tu reconstruis la liste avec ce qui reste : quand la sélection est terminée, tu supprimes la table temporaire et le tour est joué

Posté : 18 mai 2006, 20:52
par Truc
Ca me parait quand même bien compliqué de crée une nouvelle table pour ça. Je n'ai peut être pas saisi le but de la question mais ce serrait possible avec du javscript ou php.

L'option de la liste doit-elle disparaitre juste pour la session en cours ou pour toutes les sessions de tout utilisateur qui viendrait ?

La liste est-elle construite en fonction d'une base de donnée ? suffit peut être d'ajouter un chmap "sélectionné" 1 ou 0 (oui ou non) et afficher l'option en fonction.

Posté : 19 mai 2006, 08:32
par travisbarker
Ca me parait quand même bien compliqué de crée une nouvelle table pour ça. Je n'ai peut être pas saisi le but de la question mais ce serrait possible avec du javscript ou php.

L'option de la liste doit-elle disparaitre juste pour la session en cours ou pour toutes les sessions de tout utilisateur qui viendrait ?

La liste est-elle construite en fonction d'une base de donnée ? suffit peut être d'ajouter un chmap "sélectionné" 1 ou 0 (oui ou non) et afficher l'option en fonction.
En fait ce menu déroulant est composé des numéros de 1 à 23. Quand on créé une personne, on lui attribue un numéro choisi dans cette liste. Et une fois qu'un numéro est attribué à une personne, on ne peut plus le donner à quelqu'un d'autre.
Il faudrait donc trouver un moyen pour avertir l'utilisateur qu'un numéro n'est plus disponible.
J'espère que c'est plus clair maintenant...

Posté : 19 mai 2006, 08:40
par sadeq
Et pourquoi ne pas le faire automatiquement au moment de l'ajout de la personne sans l'intervention de l'utilisateur et donc sans liste déroulante!
Ceci suggère que tu dois compter tes personnes avant d'en rajouter.

Posté : 19 mai 2006, 09:55
par travisbarker
Non en fait ce que je fais, c'est une petite application où l'utilisateur peut ajouter et supprimer des personnes (qui sont stockées dans une table de a BD).
La table peut contenir au maximum 23 personnes, qui portent les numéros de 1 à 23.
Le problème, c'est que une fois qu'un numéro est attribué, il ne devrait plus être choisissable, ou en tout cas, il devrait y avoir quelque chose pour avertir l'utilisateur que le numéro est déja pris. C'est pour ça que j'avais pensé supprimer les numéros déja utilisés de la liste.

Posté : 19 mai 2006, 10:11
par sadeq
J'insiste sur ma première idée, une clé primaire ou index unique auto-incrément placé du côté de la table de BD t'exonère de devoir gèrer ça au niveau programme et interface utilisateur.
Le max 23 peut être géré par un compte de l'existant dans la BD.

Mais c'est toi qui vois :wink:

Posté : 19 mai 2006, 10:50
par travisbarker
J'ai peut être mal compris, mais dans ton cas, l'utilisateur n'a pas la possibilité de choisir le numéro, ou bien ?

Posté : 19 mai 2006, 11:10
par sadeq
Si l'utilisateur doit choisir, le n° doit être un index unique au niveau de la base de données.
La liste des n° doit être remplie à partir de l'existant, voici une suggestion:
//Remplir la liste des n°
$sql = "select * from joueur order by n°";
while ( $joueur = mysql_fetch_array(mysql_db_query("foot", $sql) , mysql_connect("localhost", "root", "") ) {

    //stocker l'identité du joueur par n°
    $n°[ $joueur["n°"] ] = $joueur; //tableau n° indexé par n° et contient l'identité d'un joueur

} //joueur suivant

//remplir la liste par les n° manquants min:1 max:23
for ($i=1; $i<=23; $i++) if ( !isset(n°[$i]) ) $liste_n° [] = $i;

//Ecrire la liste déroulante en html basée sur le tableau $liste_n°
....

Posté : 19 mai 2006, 11:16
par pascaltje
en meme temps, je suppose qu'il n'y a pas qu'une seule équipe, donc index unique, ok si on le fait sur le couple ( numero du joueur, idequipe ) .

à ta place je ferai un formulaire avec 23 lignes, les 23 numeros étant remplis;
lors de l'enregistrement, vérifier la cohérence des numeros, et voila.

A+

Pascal

Posté : 19 mai 2006, 11:19
par SAEVEAS
En résumé, tu veux permetre d'assigner des numeros de maillots à tes joueurs. Chaque numero assigné doit disparaitre de la liste des l'assignation.

A mon sens nul besoin de BDD dans le cas present.
Tu declare une variable de session
$_SESSION["equipe"] = array ("numero", "id_player", [autre champs utile])
A chaque attribution de maillot tu entre le numero de maillot choisit et le nom (ou id du joueur). Ensuite tu reconstruit ton select a partir du tableau. Une fois que les 23 numero sont la tu sauvegarde l'association dans ta BDD

il te faudra en fonction
- add_player = associe a un joueur un num de maillot
- save_position = sauvegarde l'association joueur/numero dans la base de donnée
- load_position = charge dans le tableau l'association existante

cela te permettra en outre de pouvoir rajouter des fonction utile par le suite en ne travaillant que sur le tableau sans toucher a la BDD.

Posté : 19 mai 2006, 12:12
par travisbarker
En résumé, tu veux permetre d'assigner des numeros de maillots à tes joueurs. Chaque numero assigné doit disparaitre de la liste des l'assignation.

A mon sens nul besoin de BDD dans le cas present.
Tu declare une variable de session
$_SESSION["equipe"] = array ("numero", "id_player", [autre champs utile])
A chaque attribution de maillot tu entre le numero de maillot choisit et le nom (ou id du joueur). Ensuite tu reconstruit ton select a partir du tableau. Une fois que les 23 numero sont la tu sauvegarde l'association dans ta BDD

il te faudra en fonction
- add_player = associe a un joueur un num de maillot
- save_position = sauvegarde l'association joueur/numero dans la base de donnée
- load_position = charge dans le tableau l'association existante

cela te permettra en outre de pouvoir rajouter des fonction utile par le suite en ne travaillant que sur le tableau sans toucher a la BDD.
Et en laissant ma liste déroulante, mais en rajoutant au bas du formulaire d'ajout une liste avec les numéros déja pris c'est pas possible ?
C'est pas très esthétique, mais ça peut simplifier le problème.

Et j'aimerais garder ma liste déroulante pour éviter d'avoir à tester si le numéro entré est valide (si c'est bien un numéro et s'il est compris entre 1 et 23)

Posté : 23 mai 2006, 10:50
par travisbarker
J'ai repensé à mon idée de tableau annexe avec les numéros affichés d'une façon différente suivant leur état (déja choisi ou non).
Je pensais faire un tableau avec les numéros de 1 à 23 et colorer le fond de la case en vert si le numéro est disponible et en rouge si le numéro est déja choisi.
Je dois faire comment pour créer cette table annexe ?

Posté : 26 sept. 2006, 22:27
par ItaloBADI
Si je peux me permettre... :oops:

Pourquoi tu ne vas pas chercher le numéro dans la liste des joueurs sur la BDD ?

Tu dis avoir une liste des joueurs de 1 à 23....

Donc, en ajoutant la colonne "selection" dans cette table, avec une valeur par defaut "NON"
et lorsqu'un joueur est entré sur une des 23 places, la case "selection" est changée en "OUI" par un simple UPDATE.

A partir de ça, au lieu de faire ton select comme tu le fais, tu pourrais faire :

( je fais comme si ta table de joueurs se nomme "joueurs" )
	<select name="numero" onchange="rediretion()">
		<? 
		$sql = "SELECT numero FROM joueurs where selection='NON'";
		$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
		
		while($data = mysql_fetch_assoc($req)) 
		{      
		     echo' <option value="' . $data['numero'] . '">' . $data['numero'] . '</option>';
			 $i++; 
		} 
		?> 
		</select>
AINSI, ta liste déroulante ne sera composée QUE des numéros non encore sélectionnés.

Enfin, moi, c'est comme ça que je ferais...
Si ça peut aider...

Posté : 27 sept. 2006, 07:51
par mojorisin
Personnelement je gererais ca à l'aide de SQL
Une table a une colonne ou tu stock les numéros de maillot (tous de 1 à 23)

Ensuite pour construire ta liste déroulante tu part de cette table avec une jointure sur la table des joueurs sur le numéro et ne retenant que les entrée étant null dans la seconde table.

Je sais pas si c'est tres clair :
SELECT numero FROM numeros AS n
LEFT JOIN joueurs AS j
ON n.numero=j.numero
WHERE j.numero IS NULL

Cette structure et plus souple dans le sens ou si tu souhaite disposer de plus de numéro, tu n'as rien a recoder, il te suffit d'ajouter une entrée dans la table numéros