Después de buscar muchos recursos / respuestas sobre este tema, decidí codificar el mío. Según la respuesta de @ TaylorOtwell aquí, así es como proceso la solicitud $ _GET entrante y modifico / manipulo cada elemento.
Suponiendo que la URL es: http://domain.com/category/page.php?a=b&x=y
Y solo quiero un parámetro para ordenar: ¿? Desc = column_name o? Asc = column_name. De esta manera, un solo parámetro de URL es suficiente para ordenar y ordenar simultáneamente. Entonces, la URL será http://domain.com/category/page.php?a=b&x=y&desc=column_name en el primer clic de la fila de encabezado de la tabla asociada.
Luego tengo encabezados de filas de tabla que quiero ordenar DESC en mi primer clic y ASC en el segundo clic del mismo encabezado. (Cada primer clic debe "ORDER BY COLUMNA DESC" primero) Y si no hay clasificación, se ordenará por "fecha y luego id" de forma predeterminada.
Puede mejorarlo aún más, como si pudiera agregar funciones de limpieza / filtrado a cada componente $ _GET, pero la estructura siguiente sienta las 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, '&');}
(Puede usar $ _SERVER [SCRIPT_URI] para la URL completa que comienza con http://domain.com )
Luego utilizo el $ ORDER resultante que obtengo arriba, en la consulta MySQL:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
Ahora la función para mirar la URL si hay una clasificación previa y agregar el parámetro de clasificación (y ordenación) a la URL con "?" o "&" según la secuencia:
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, el encabezado de la fila de la tabla para usar la función:
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
Resumen: esto leerá la URL, modificará cada uno de los componentes $ _GET y creará la URL final con los parámetros de su elección con la forma correcta de uso de "?" y "&"
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);. Pero necesitarápecl install pecl_httpo instalar jakeasmith / http_build_url a través del compositor.