8792 sujets

Développement web côté serveur, CMS

J'ai une page dans laquelle j'affiche certains elements dans une liste. Ces elements proviennent d'une base.
A l'aide de boutons + et - j'ai la possibilité de changer l'ordre des elements dans la liste. Une fois que c'est ok je clique sur un bouton valider qui réexecute la page pour faire un traitement.
Ce que je veux comme traitement c'est de réécrire dans la base les elements de la liste dans le nouvel ordre.

Ma question est de savoir comment, en php, récupérer tous les éléments de la liste dans le nouvel ordre, et non seulement ceux qui sont sélectionnés.

merci de votre aide.
A mon avis, deux solutions, mais elles nécéssitent toutes deux javascript.
D'ailleurs si quelqu'un trouve une façon efficace de faire ça sans js, je suis preneur.

Solution 1 :
Déclarer la liste en mode multiple et sélectionner automatiquement tous les items avant soumission.

Exemple :

JS :
function formsubmit () {
var l = document.getElementById('liste');
for (var i=0; i < l.options.length; i++) l.options[ i ].selected = true;
}

HTML :
<form ... onsubmit="return formsubmit();">
...
<select multiple="multiple" id="liste" name="liste[]">
...
</select>
...
</form>

Dans la mesure où les listes de définition d'ordre avec monter/descendre ne devraient en toute logique pas permettre la sélection multiple, je te conseille la deuxième.
IL n'est pas possible, sur certains navigateurs, de définir le statut multiple à la volée.
IL ne faut à ce moment-là ne pas oublier les crochets dans le nom, permettant ainsi à php de récupérer les valeurs sous forme de tableau.

Solution 2 :
Utiliser un champ hidden reprenant les valeurs de la liste linéairement, à mettre à jour à chaque modification ou juste avant envoi :


JS :
function updateHidden () {
var l = document.getElementById('liste');
var o = document.getelementById('champhidden');
var tab = new Array();
for (var i=0; i < l.options.length; i++) tab.push(l.options[ i ].value);
o.value = tab.join(',');
}

HTML :
<form ... >
...
<select id="liste">
<option value="AAA">AAA</option>
<option value="BBB">BBB</option>
<option value="CCC">CCC</option>
...
</select>
<input type=hidden" name="champhidden" id="champhidden" value="AAA,BBB,CCC" />
...
</form>

Et il suffit d'appeler la fonction de mise à jour après chaque clic sur +/- ou juste avant envoi (onsubmit).
Modifié par QuentinC (16 Mar 2007 - 06:08)
Salut !
a écrit :

Dans la mesure où les listes de définition d'ordre avec monter/descendre ne devraient en toute logique pas permettre la sélection multiple...

Je ne vois pas pourquoi tu dis ca...Si tu veux monter/descendre plusieurs élements en même temps tu fais comment ?
La gestion du monter/descendre en sélection multiple n'est pas problèmatique.
Il suffit de bien gérer tous les cas dans les traitements.

Concernant ton problème, il te suffit d'auto-sélectionner les élements de la liste, comme QuentinC te l'a indiqué dans sa solution n°1.
pour ta gestion d'ordre en sélection multiple, il te suffit de bien penser à tous les cas possibles.
Modifié par Zeke (16 Mar 2007 - 10:41)