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.

Pierre-Emmanuel Fringant

Commentaires

Merci beaucoup pour cette petite astuce.

[...] 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 : [...]

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/

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

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 :

$pageRetour = $this->referer(array('action'=>'index'), true);
$this->redirect($pageRetour);

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) ^^

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

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.

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

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.

Participez

Pour insérer une portion de code, utilisez <pre lang="php">...</pre>