martes, 16 de marzo de 2010

Evitar advertencia "La página ha caducado" en el navegador (IE - PHP)

Esto suele ser un problema comun a la hora de hacer POST en html y redireccionar a una nueva página a través de un enlace o algún cambio en el header. Hice una solución que me parece práctica cuando se pulsa el boton del navegador "Atrás" no responda con esa molesta advertencia.

La técnica consiste en tomar todas las variables $_POST, procesar las que se consideren adecuadas y redireccionar las mismas variables a través de un $_GET. Esto funciona bien cuando hacemos formularios de búsqueda que generan un listado, al que luego de hacer click en algún item se redirecciona a un nuevo enlace.

El código puede ser escrito como en el siguiente ejemplo:


function EstandarizarQueryString
($excepciones = "") {
if(!is_array($excepciones))
$excepciones = array($excepciones);
$est = array();
$querystring = "";
foreach($_GET as $key => $value) $est[$key] = $value;
foreach($_POST as $key => $value) $est[$key]=$value;
foreach($est as $key => $value) {
if(!in_array($key,$excepciones)) {
if(!empty($value) && $value!="0" && $value!="null") $querystring.="&".$key."=".urlencode($value);
}
}
return substr($querystring,1);
}


Una vez implementada esta funcion, se pueden reescribir los URL y manejar todos (o algunos) de los parametros REQUEST de la página de la siguiente manera:


if($_POST && !$_POST['botonexcepcion']) {
header("location: ".basename($_SERVER['PHP_SELF'])."?".EstandarizarQueryString());
exit();
}
// Aqui se manejan todos los parametros por $_GET ...

Con esto se evita una reconfirmación del POST cuando se ejecuta un evento history.back o cuando se pulsa el botón "Atrás" del navegador (Generalmente pasa en IE).

No hay comentarios: