Depois de pesquisar muitos recursos / respostas sobre este tópico, decidi codificar o meu próprio. Com base na resposta de @TaylorOtwell aqui, é assim que processo a solicitação $ _GET de entrada e modifico / manipulo cada elemento.
Supondo que o url seja: http://domain.com/category/page.php?a=b&x=y
E eu quero apenas um parâmetro para classificação:? Desc = column_name ou? Asc = column_name. Dessa forma, um único parâmetro de url é suficiente para classificar e ordenar simultaneamente. Portanto, o URL será http://domain.com/category/page.php?a=b&x=y&desc=column_name no primeiro clique da linha de cabeçalho da tabela associada.
Então, tenho cabeçalhos de linha de tabela que desejo classificar DESC no meu primeiro clique e ASC no segundo clique do mesmo cabeçalho. (Cada primeiro clique deve "ORDER BY coluna DESC" primeiro) E se não houver classificação, ele será classificado por "data e id" por padrão.
Você pode melhorá-lo ainda mais, como pode adicionar funções de limpeza / filtragem a cada componente $ _GET, mas a estrutura abaixo estabelece a base.
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, '&');}
(Você pode usar $ _SERVER [SCRIPT_URI] para URL completo começando com http://domain.com )
Então eu uso $ ORDER resultante obtido acima, na consulta MySQL:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
Agora a função de olhar para a URL se houver uma classificação anterior e adicionar o parâmetro de classificação (e ordenação) à URL com "?" ou "&" de acordo com a sequência:
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";
}
}
}
Finalmente, o cabeçalho da linha da tabela para usar a função:
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
Resumo: isso irá ler a URL, modificar cada um dos componentes $ _GET e fazer a URL final com parâmetros de sua escolha com a forma correta de uso de "?" e "&"
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);. Mas você precisarápecl install pecl_httpinstalar jakeasmith / http_build_url via composer.