[PHP] CodeIgniter - Redirection dans un appel Ajax

Aujourd'hui une petite astuce assez rapide, pour pouvoir faire une redirection PHP lors d'un appel effectué en Ajax dans CodeIgniter 2.
Vous avez peut-être déjà eu cette expérience, votre site commence a ressembler à quelque chose, et là vous mettez en place un module en Ajax au sein d'une page. Jusque là tout va bien, sauf que la page courante n'est accessible qu'aux utilisateurs logués. Et alors me direz vous ?
Votre site est bien fait, et vous avez prévu une redirection si la session est timed out. C'est très bien, sauf qu'avec un appel ajax la redirection se fait ... dans l'ajax !! Et du coup, vous aurez toujours votre page, et dans votre bloc ajax s'affichera magnifiquement bien, la page redirigiée (par exemple la page de login) !
MISE EN PLACE
Pour y remédier, il y a une façon très simple et rapide de faire, il faut surcharger le helper redirect natif à CI.
Pour celà, créez le fichier MY_url_helper.php dans le dossier /application/helpers si ce n'est pas déjà fait.
ATTENTION : par défaut le préfixe de surcharge est MY_, il est modifiable dans le config.php de CI
Ensuite collez la nouvelle fonction redirect :
/**
* Header Redirect
*
* Header redirect in two flavors
* For very fine grained control over headers, you could use the Output
* Library's set_header() function.
*
* @access public
* @param string the URL
* @param string the method: location or redirect
* @return string
*/
if ( ! function_exists('redirect'))
{
function redirect($uri = '', $method = 'location', $http_response_code = 302)
{
if ( ! preg_match('#^https?://#i', $uri))
{
$uri = site_url($uri);
}
$CI = &get_instance();
if($CI->input->is_ajax_request()) {
echo '<script language="javascript">location.href="'.$uri.'"</script>';
exit;
}
switch($method)
{
case 'refresh' : header("Refresh:0;url=".$uri);
break;
default : header("Location: ".$uri, TRUE, $http_response_code);
break;
}
exit;
}
}
Le code rajouté se situe de la ligne 22 à 26. On test si l'appel à la fonction redirect est au sein d'un appel ajax, et à se moment là on effectue une redirection en js globale.
Et ... voilà c'est tout ça fonctionne tel quel, sans rien modifier d'autre ! Vos appels à la fonction redirect() seront tous impactés automatiquement.
Toute suggestion d'optimisation est la bienvenue, c'est la solution la plus courte et optimale que j'ai trouvée pour l'instant.
Ben



