Revenir à la bonne page après l’édition d’un enregistrement
Imaginons l’interface d’administration d’une boutique avec des centaines de produits. Il devient vite énervant quand l’administrateur parcourt plusieurs pages, édite un enregistrement, valide puis revient à la première page du listing, avec les critères de tri par défaut ! Nous allons voir comment stocker l’url de la page que nous quittons pour arriver sur la page d’édition, puis rediriger sur cette page de départ après l’enregistrement des modifications.
Il suffit en fait d’enregistrer en session la page de départ, qui nous est fournie par la méthode Controller::referer(). Voyons le Contrôleur qui gère les produits de la boutique :
// {app}/controllers/references_controller.php class ReferencesController extends AppController { // Options de pagination par défaut var $paginate = array( 'order' => 'Reference.created DESC', 'limit' => 10 ); function admin_index() { $this->set('data', $this->paginate()); } function admin_edit($id = null) { if(isset($this->data)) { $this->Reference->set($this->data); if (!$this->Reference->validates()) { $this->Session->setFlash("Corrigez les erreurs mentionnées.", 'message_notice'); return; } $this->Reference->save($this->data, false); $this->Session->setFlash("Données enregistrées.", 'message_ok'); // On redirige vers la page de listing que nous venions de quitter $this->redirect($this->Session->read('Temp.referer')); } // On enregistre l'url de la page qui a mené ici $this->Session->write('Temp.referer', $this->referer()); $this->data = $this->Reference->read(null, $id); } }
Cette méthode renvoie bien sur la page de listing que nous avions quittée, même en cas d’erreur de validation sur la page d’édition.
Commentaires
12 décembre 2008 à 22:53
Merci beaucoup pour cette petite astuce.
18 décembre 2008 à 10:22
[...] en la combinant aux sessions. Pour en savoir plus, je vous invite à visiter l’article Revenir à la bonne page après l’édition d’un enregistrement sur Formation Cakephp.SHARETHIS.addEntry({ title: « Gérer un retour vers la page précédente : [...]
18 décembre 2008 à 10:26
Je trouve cette méthode (referer()) tellement pratique ! C’est une très bonne idée de la coupler aux sessions pour cette application.
Je viens également d’écrire une rapide présentation de cette méthode pour utiliser ses autres fonctionnalités et créer des liens « Retour » propres. Si cela intéresse quelqu’un c’est par là : http://www.pierre-martin.fr/cakephp/retour-page-precedente-controller-referer/
27 février 2009 à 10:11
Bonjour et merci pour l’idée !
y aurait-il moyen, sur le même principe, de revenir à la bonne page après suppression ? Étant donné que l’action delete ne se fait qu’en une seule passe, je ne sais pas trop comment faire…
merci d’avance
27 février 2009 à 10:21
Essaye de comprendre ce code, ainsi que celui publié sur l’article de mon blog (commentaire du dessus).
Ainsi, quelque chose comme ça te permettra de faire se que tu veux :
27 février 2009 à 14:55
Merci, c’est ce que j’ai essayé et ça fonctionne bien, mais je voulais juste être sûre (je sais par expérience que la gestion des pages précédentes peut parfois être délicate, je me suis déjà trouvé « coincée » dans des redirections infinies avec une mauvaise page précédente) ^^
7 mars 2009 à 3:59
Bonjour,
Tu auras un problème avec cette méthode si l’utilisateur édite un enregistrement mais le formulaire ne valide pas.
save() va retourner false, et ton Temp.referer vas être écrasé avec lien d’edit. après que l’utilisateur corrige le formulaire, il va être redirigé vers la page de l’edit elle même. Il faut implémenter un stack history de tous les referer passés ( avec une limite de 10 pages par exemple ) ou un stack rotatif.
Il y a sûrement un component de ça sur la bakery
Cordialement Oth
7 mars 2009 à 10:38
Tu n’as pas lu la dernière phrase du tuto… Je confirme que ma méthode fonctionne tout à fait comme attendu même en cas d’erreur de validation.
8 juin 2009 à 15:15
Bonjour,
je viens de lire ce tuto, si j’ai bien compris il permet de revenir sur la page que l’on vient de quitter, cependant dans mon cas cela est différent, j’aimerais revenir 2 pages avant, non sur celle qui edit mes données mais sur un tableau qui m’affiche les valeurs editées. c’est dans ce tableau que figure les liens me permettant d’afficher ma page d’edition
cela est t-il possible en utilisant la méthode referer
merci d’avance cordialement
31 janvier 2010 à 21:58
je viens d’ajouter ce code à mon controller edit et ça marche super sauf qu’on a plus le message « flash » de confirmation de l’opération. C’est assez ennuyeux.