Trier un select avec optgroup

Eléphant du PHP | 337 Messages

31 août 2012, 15:15

Bonjour à tous,

J'ai deux select sur ma page, un à gauche contenant une liste prédéfinie, un à droite qui est vide.
Je voudrais qu'en double cliquant à gauche, l'élément choisi passe à droite et disparaisse de gauche.
Inversement, en double cliquant à droite, l'élément de droite disparaît et repasse à gauche à sa position initiale.

Pour le moment j'arrive à faire passer les éléments de l'un à l'autre, à trier le select de droite, mais pas plus, d'autant que ma liste de gauche est classée avec des optgroup.

Le code que j'ai pour le moment est le suivant :
$LISTE_INGREDIENTS = array(1 => 'Épices & condiments','Desserts & pâtisseries','Produits laitiers','Légumes','Fruits','Céréales, farines & pâtes','Conserves','Poissons & fruits de mer','Viandes','Boissons');

echo "<FORM name='formulaire_recettes' action=''>";
echo "<select name='liste' id='Select_Liste' size='30' onDblClick='Ingredients(1);'>";
for($i=1 ; $i<=sizeof($LISTE_INGREDIENTS) ; $i++)
{
	echo "<optgroup label='".$LISTE_INGREDIENTS[$i]."'>";
	$result = mysql_query("SELECT * FROM $INGREDIENTS WHERE cat='$i' ORDER BY titre ASC");
	while($row = mysql_fetch_array($result))
	{
		echo "<option value='".$row['id']."'>".$row['titre']."</option>";
	}
	echo "</optgroup>";
}
echo "</select>";

echo "<select name='ingredients' id='Select_Ingredients' size='30' onDblClick='Ingredients(2);'>";
for($i=1 ; $i<=sizeof($LISTE_INGREDIENTS) ; $i++)
{
	
}
echo "</select>";
...et le javascript :

[javascript]function Ingredients(X)
{
var selectListe = document.getElementById('Select_Liste');
var selectIngredients = document.getElementById('Select_Ingredients');

// Ingrédients --> Liste
if(X == 1)
{
selectIngredients.options[selectIngredients.options.length] = new Option(selectListe.options[selectListe.selectedIndex].text, selectListe.options[selectListe.selectedIndex].value);

// Tri
Listatrier = new Array();

for(i=0 ; i<selectIngredients.options.length ; i++)
{
Listatrier = new Array();
Listatrier[0] = selectIngredients.options.text;
Listatrier[1] = selectIngredients.options.value;
}
Listatrier = Listatrier.sort();

for(i=0 ; i<selectIngredients.options.length ; i++)
{
selectIngredients.options.text=Listatrier[0];
selectIngredients.options.value=Listatrier[1];
}
}
// Liste --> Ingrédients
else
{
selectIngredients.options[selectIngredients.selectedIndex] = null;
}
}[/javascript]


Comme vous pouvez le constater, les optgroup proviennent d'une variable array écrite "en dur" dans le code PHP (cette liste n'a aucune raison d'évoluer), en revanche, les options sont dynamiques et proviennent d'une table sql.

Eeeuh voilà je crois que j'ai tout dit, j'espère avoir été clair et que mon problème inspirera un spécialiste :D


Edition : ça donne un truc qui ressemble à ça (la liste de droite n'a pas besoin d'être triée selon les optgroup)

Image

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 sept. 2012, 00:21

salut,

un truc dans ce genre ? http://jqueryui.com/demos/sortable/#connect-lists


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 337 Messages

01 sept. 2012, 12:43

Hhhmmm oui, plutôt dans ce goût-là, ça n'a même pas besoin d'être aussi chiadé, du reste.
Les différences sont quand même que j'ai besoin d'avoir des catégories distinctes, ainsi que le tri automatique des listes.
(en tout cas, super boulot que le gars a fait, ce truc est tout bonnement génial).