Après avoir recherché de nombreuses ressources / réponses sur ce sujet, j'ai décidé de coder les miennes. Sur la base de la réponse de @ TaylorOtwell ici, voici comment je traite la requête $ _GET entrante et modifie / manipule chaque élément.
En supposant que l'URL est: http://domaine.com/category/page.php?a=b&x=y
Et je ne veux qu'un seul paramètre pour le tri: soit? Desc = nom_colonne ou? Asc = nom_colonne. De cette façon, un seul paramètre d'url suffit pour trier et ordonner simultanément. Ainsi, l'URL sera http://domain.com/category/page.php?a=b&x=y&desc=column_name au premier clic de la ligne d'en-tête de tableau associée.
Ensuite, j'ai des en-têtes de ligne de tableau que je veux trier DESC sur mon premier clic, et ASC sur le deuxième clic du même en-tête. (Chaque premier clic doit d'abord "ORDER BY column DESC") Et s'il n'y a pas de tri, il triera par "date puis id" par défaut.
Vous pouvez l'améliorer davantage, comme vous pouvez ajouter des fonctions de nettoyage / filtrage à chaque composant $ _GET, mais la structure ci-dessous pose les bases.
foreach ($_GET AS $KEY => $VALUE){
if ($KEY == 'desc'){
$SORT = $VALUE;
$ORDER = "ORDER BY $VALUE DESC";
$URL_ORDER = $URL_ORDER . "&asc=$VALUE";
} elseif ($KEY == 'asc'){
$SORT = $VALUE;
$ORDER = "ORDER BY $VALUE ASC";
$URL_ORDER = $URL_ORDER . "&desc=$VALUE";
} else {
$URL_ORDER .= "&$KEY=$VALUE";
$URL .= "&$KEY=$VALUE";
}
}
if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';}
if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');}
if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}
(Vous pouvez utiliser $ _SERVER [SCRIPT_URI] pour l'URL complète commençant par http://domain.com )
Ensuite, j'utilise $ ORDER obtenu ci-dessus, dans la requête MySQL:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
Maintenant, la fonction pour regarder l'URL s'il y a un tri précédent et ajouter le paramètre de tri (et de classement) à l'URL avec "?" ou "&" selon la séquence:
function sort_order ($_SORT){
global $SORT, $URL_ORDER, $URL;
if ($SORT == $_SORT){
return $URL_ORDER;
} else {
if (strpos($URL, '?') !== false){
return "$URL&desc=$_SORT";
} else {
return "$URL?desc=$_SORT";
}
}
}
Enfin, l'en-tête de ligne du tableau pour utiliser la fonction:
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
Résumé: cela lira l'URL, modifiera chacun des composants $ _GET et créera l'URL finale avec les paramètres de votre choix avec la forme correcte d'utilisation de "?" et "&"
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);
. Mais vous aurez besoinpecl install pecl_http
ou installez jakeasmith / http_build_url via composer.