Page 1 sur 2

Tri d'un tableau HTML par colonne

Posté : 15 janv. 2008, 19:00
par VaN
Bonsoir,

Je viens demander conseil aux utilisateurs de phpfrance, car je suis face un dilemne.

Sur un page web, j'affiche une liste des utilisateurs enregistrés dans la base de données du projet. Et j'aimerais pouvoir trier ce tableau de façon croissante et décroissante, en cliquant sur le titre des colonnes.

Avant de venir poster, j'ai evidemment réflechi au probleme quelques minutes, et deux solutions s'offrent à moi.

1. A chaque clic sur un titre de colonne, je mets à jour la requete SQL qui va chercher l'ensemble des utilisateurs, et je lui applique un "filtre" en fonction de quelle colonne a été cliquée. Dans ce genre là :
if($colonne == 'login') {
$filtre = 'ORDER BY user_login';
}
f($colonne == 'mail') {
$filtre = 'ORDER BY user_mail';
}
$sql = "SELECT * FROM users ".$filtre";
Ce système va prendre un peu de temps, et encore un peu de reflexion, pour mettre au point le tri croissant/décroissant.

2. l'autre solution que j'ai envisagée est de stocker ma requête de base dans un tableau PHP, et de lui appliquer une fonction de tri php, du genre sort(), a chaque clic sur le titre de la colonne. Je n'ai encore jamais utilisé cette fonction, donc je ne sais pas encore de quoi il en retourne, et si ce que je souhaite faire est facile à mettre en place avec cette solution.

Donc, selon vous, quelle serait-elle la meillure des solutions ? En avez-vous d'autres ?

Posté : 15 janv. 2008, 19:39
par Ryle
Si tu n'utilises pas de pagination et que toutes tes données sont sur une même page, il existe des librairies javascript assez extra pour ce genre de chose :)

Personnellement, ne sachant généralement si j'aurais une ou plusieurs pages, j'opte pour la première de tes solutions, laissant le soin à la bdd de m'ordonner les éléments pour que php n'ait plus qu'à les afficher.
Pour le sens, il suffit d'une donnée booléenne que tu inverseras à chaque fois et qui te permettra de savoir si le tri est ascendant ou descendant :)

Pour le tri sur le tableau php, c'est faisable, mais c'est un tri sur un tableau multi-dimensionnel, donc un peu plus compliqué et plus long qu'un simple sort()... ça dépend donc également de la quantité de données, mais l'avantage c'est que tu peux coller ton tableau en session et y accéder plus rapidement pour de la pagination par exemple :)

Posté : 15 janv. 2008, 20:05
par VaN
A vrai dire, je ne sais pas encore si y'aura un systeme de pagination ou non. Ca va dependre des besoins de mon client. A priori, je dirai que non.

Tu aurai des exemples de script javascript dont tu parles ?

Et pourrais-tu egalement m'expliquer brievement ton idée de booleen ? (c'est quelque chose que je n'utilise jamais)

merci deja pour cette reponse : )

Posté : 15 janv. 2008, 20:28
par AB
A vrai dire, je ne sais pas encore si y'aura un systeme de pagination ou non. Ca va dependre des besoins de mon client. A priori, je dirai que non.
merci deja pour cette reponse : )
Oui mais fait attention quand même car parfois les clients peuvent changer d'avis, ou les besoins peuvent évoluer en fonction du nombre des données.

Posté : 16 janv. 2008, 00:14
par Ryle
Voici quelques exemples de tableaux triables avec javascript, une petite recherche sur google avec le mot clé "sortable" t'en proposera bien d'autres :)
http://www.kryogenix.org/code/browser/sorttable/
http://www.pascarello.com/sortTable/

Quant au booléen, l'idée est simplement dans le lien que tu cliques pour changer l'ordre du tableau de rajouter un paramètre qui aura par exemple pour valeur true/false ou 1/0 (php affichant 1 quand tu lui demandes d'afficher la valeur d'un booléen vrai) selon que le tri soit descendant ou ascendant (par défaut). Supposons le lien :
href="script.php?column=name&order=1"
Tu récupère alors $_GET['column'] avec le nom de la colonne et $_GET['order'] qui sera à 1 pour un tri DESC ou à 0 pour un ASC. Il te suffit donc d'un simple if() pour ajouter le mot clé adéquat dans ta requête et d'un point d'exclamation pour inverser la valeur booléenne et proposer l'ordre inverse dans ton lien :
<?php
$order = isSet($_GET['order']) ? $_GET['order'] : false;
...
$sql = "SELECT ... ORDER BY machin " . ($order ? 'DESC':'ASC');
?>
... href="script.php?column=name&order=<?php echo !$order;?>" ...
Bon là c'est la version basique et certains raleront sans doute quant à ma syntaxe et le fait de tester une variable sans la comparer à quelque chose, mais t'as les grandes lignes :) Après j'ai tendance à compléter le test en ne proposant le tri inversé que sur la colonne sélectionnée afin que les autres proposes toujours l'ascendant par défaut quand on change de colonne de tri...

Posté : 16 janv. 2008, 01:11
par VaN
ok, je comprends un peu mieux, merci : )

Là il est un peu tard pour me replonger dans le script, je m'y remet demain, et je reviens poster si je bute sur quelque chose.

Merci bien.

Posté : 16 janv. 2008, 01:36
par dogmongo
Bonjour,

Peu être Ajax ? ca éviterai de traiter les conditions, tu crée autant de fichier que de critère, et c'est uniquement en temps réelle que la requête de l'utilisateur sera prit en compte.

S’il clique sur le lien login c'est uniquement login qui sera traité par un fichier qui traite uniquement la requête avec ORDER BY login.

Ensuite tu y gagneras en fluidité vu que la page ne se réactualisera pas

Cela dit ce n’est pas tout à fait la vraie utilisation Ajax mais une utilisation dérivé de celui-ci pour ne pas fâcher les puristes, en tout cas je suis pratiquement certain qu’il serait la solution dans le cas présent.

Posté : 16 janv. 2008, 01:52
par dogmongo
J'ai dis une betise tu as besoin d'un seul fichier puisque le champ qui donne l'ordre peu etre passé en Variable

l'action de l'urilisateur

Code : Tout sélectionner

<a href="#" onClick="Order()">login</a>
champ représente la variable machin bidule ou autre

la fonction ajax

Code : Tout sélectionner

xhr.open("POST","traitement-interne-de-la-requete.php",true); xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); sel = document.getElementById(champ); champ = sel.options[sel.selectedIndex].value; xhr.send("champ="+champ);
traitement-interne-de-la-requete.php

Code : Tout sélectionner

if(isset($_POST["champ"])){ $sql = "SELECT * FROM users ORDER BY $_POST["champ"] "; ........... etc ...... // ici tu renvoi le résultat sur la page d'origine echo "<div id='texte'> le nouveau tableau repart sur la page d'origine </div>"; }

Posté : 16 janv. 2008, 11:49
par Berzemus
Il y a aussi le très bon plugin tablesorter pour jquery..

Posté : 16 janv. 2008, 15:40
par VaN
Franchement Ryle, merci pour cette URL, ce script est genial. Quelques modifs extrement faciles à appliquer, et je me retrouve avec un tableau totalement triable qui a énormement de gueule, le tout géré à 100% coté client.

Hop, direct en Marque-Pages, en 3 minutes, c'est devenu un must-have pour tous mes prochains projets :)

Posté : 16 janv. 2008, 17:46
par Berzemus
Tablesorter permet de trier plusieurs colonnes.. :twisted:

Posté : 16 janv. 2008, 17:50
par steph29
+1 pour tablesorter :wink:

Posté : 16 janv. 2008, 18:06
par Ryle
Peut être mais sortTable conserve un tri ascendant par défaut lorsque tu changes de colonne de tri alors que ton Tablesorter inverse à chaque fois le sens sans se soucier d'un changement de colonne :P

Plus sérieusement, faut pas installer un script parce qu'il fait plus de chose qu'un autre (sinon j'en ai plein à te faire installer ;)), il faut installer le script qui fait ce dont on a besoin (et accessoirement, celui qui est adapté à son framework : s'il utilise jquery, ce serait effectivement dommage de se priver de tablesorter, mais s'il utilise une autre librairie, ce serait encore plus dommage de commencer à les cumuler :))

Posté : 17 janv. 2008, 11:29
par Berzemus
Tu as entièrement raison: si on utilise déjà un framework ce serait dommage de se priver de ses atouts, tout comme la multiplication ne peu qu'engendrer des complications inutiles. Et on peut tout aussi bien décider de ne pas utiliser des framework du tout, pour rester "pur" (mais c'est dommage de s'en priver).

Mais moi, j'ai steph qui est d'accord avec moi. :wink:

Posté : 17 janv. 2008, 11:44
par steph29
je precise ma reponse alors :twisted:

En regle generale pour les tris de tableau, je le fait systematiquement au niveau de la requete donc methode standard avec php modif du filtre et tout le toutim et rechargement de page (voire des fois maj en ajax)

mais pour aller plus vite et par facilite, sur les projets rapide un petit coup de tablesorter (que j'ai decouvert il y a peu de temps ici) pour alleger les temps de dev, mais je l'accorde c'est un peu plus lourd (surtout si petite connection et encore plus quand il y a un grand nombre d'enregistrement)

la le but est de montrer qu'il y a aussi l'alternative poste client (javascript) pour pouvoir trier des tableaux dont tablesorter qui amha est plsu pro et facile a installer (bonne doc et foultitude de cas)