Po wyszukaniu wielu zasobów / odpowiedzi na ten temat postanowiłem zakodować własne. W oparciu o odpowiedź @ TaylorOtwell tutaj, w ten sposób przetwarzam przychodzące żądanie $ _GET i modyfikuję / manipuluję każdym elementem.
Zakładając, że adres URL to: http://domain.com/category/page.php?a=b&x=y
I chcę mieć tylko jeden parametr do sortowania: albo? Desc = nazwa_kolumny lub? Asc = nazwa_kolumny. W ten sposób pojedynczy parametr adresu URL wystarczy do jednoczesnego sortowania i porządkowania. Tak więc adres URL będzie http://domain.com/category/page.php?a=b&x=y&desc=column_name po pierwszym kliknięciu powiązanego wiersza nagłówka tabeli.
Następnie mam nagłówki wierszy tabeli, które chcę posortować DESC przy pierwszym kliknięciu, a ASC przy drugim kliknięciu tego samego nagłówka. (Każde pierwsze kliknięcie powinno być najpierw „ORDER BY kolumny DESC”). Jeśli nie ma sortowania, będzie ono domyślnie sortowane według „daty i identyfikatora”.
Możesz go jeszcze bardziej ulepszyć, na przykład dodać funkcje czyszczenia / filtrowania do każdego komponentu $ _GET, ale poniższa struktura stanowi podstawę.
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, '&');}
(Możesz użyć $ _SERVER [SCRIPT_URI] dla pełnego adresu URL zaczynającego się od http://domain.com )
Następnie używam otrzymanego powyżej zamówienia $ ORDER w zapytaniu MySQL:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
Teraz funkcja, która sprawdza adres URL, jeśli istnieje poprzednie sortowanie i dodaje parametr sortowania (i porządkowania) do adresu URL z "?" lub „&” zgodnie z sekwencją:
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";
}
}
}
Na koniec nagłówek wiersza tabeli do użycia funkcji:
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
Podsumowanie: spowoduje to odczytanie adresu URL, zmodyfikowanie każdego z komponentów $ _GET i utworzenie końcowego adresu URL z wybranymi przez Ciebie parametrami z poprawną formą użycia znaku „?” i "&"
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);
. Ale będziesz potrzebowaćpecl install pecl_http
lub zainstalować jakeasmith / http_build_url za pośrednictwem kompozytora.