INDEX
Symptômes
En passant en GET un paramètre qui a déjà été passé précédemment, on multiplie dans l’URL le nombre d’occurrences. Exemple :
https://commodesk.com/items/index/0/ponderate/1?sort=pubDate&dir=desc&since=12&since=1&since=12&since=24&since=1&since=12
Idée
On utilise une expression régulière placée dans une fonction qu’on appelle avant d’écrire l’URL propre :
<?php class utils { /** * supprimer des paramètres d'une URL * * @param <array|string> $parametres clé(s) à supprimer * @param <string> $url * @return <string> */ public function delget($parametres, $url = null) { $url = !$url ? url::current().'?'.$_SERVER['QUERY_STRING'] : $url; if (is_array($parametres)) { foreach($parametres as $parametre) { $url = preg_replace('/&'.$parametre.'(=[^&]*)?|^'.$parametre.'(=[^&]*)?&?/', '', $url); } } else { $url = preg_replace('/&'.$parametres.'(=[^&]*)?|^'.$parametres.'(=[^&]*)?&?/', '', $url); } return $url; } } ?>
Puis pour l’appeler :
<a href="<?php echo url::base().utils::delget('since'); ?>&since=<?php echo $k; ?>"><?php echo $v; ?></a>
Résultat
« Des URLs toujours propres avec Ashorlivs ! »
https://commodesk.com/items/index/0/ponderate/1?sort=pubDate&dir=desc&since=12
À noter
Manuel Jinsi me fait remarquer l’emploi de la méthode url ::current ; il s’agit d’un helper du framework Kohana.
Hors de ce framework, on utilisera : $_SERVER[’REQUEST_URI’] pour récupérer cette information (voir la liste des variables prédéfinies).
Il faut aussi prendre en compte le fait que dans Kohana, pour les versions 2.x, la méthode current du helper url permet de récupérer l’URL courante avec ou sans la querystring GET, cf le manuel : helpers:url Kohana Users Guide.
Plusieurs paramètres à supprimer
Il arrive qu’on ait plusieurs paramètres à supprimer, par exemple :
https://commodesk.com/items/index/0/all?&since=12&sort=note&dir=asc
Ici on fait du tri, couplé avec since, et on veut pouvoir changer le sort (tri) et le dir (direction) sans toucher au since, sans que sort et dir ne se répètent dans l’URL.
On passe donc un array :
<a href="<?php echo url::base().utils::delget(array('sort','dir')); ?>&sort=note&dir=<?php echo $dir; ?>">Note</a>
Voilà.
De rien.
Ah mais si, merci, quand même, j’insiste… Quelques lignes de code bien utiles qui fonctionnent parfaitement.
cette fonction ne gère pas quand le paramètre est le premier : juste après le ?
C’est pas tout jeune. Vous utilisez quel framework ou CMS ?