Comment revenir à une page précédente ?

Que se passe-t-il si un utilisateur remplit un formulaire et que sa session expire ? Pour qu'il ne perde pas ses données, nous sauvegardons les données dans la session avant de le rediriger vers la page de connexion. Dans Nette, c'est un jeu d'enfant.

La requête actuelle peut être sauvegardée dans la session à l'aide de la méthode storeRequest(), qui renvoie son identifiant sous forme de chaîne courte. La méthode sauvegarde le nom du presenter actuel, la vue et ses paramètres. Si un formulaire a également été soumis, le contenu des champs (à l'exception des fichiers téléchargés) est également sauvegardé.

La restauration de la requête est effectuée par la méthode restoreRequest($key), à laquelle nous passons l'identifiant obtenu. Elle redirige vers le presenter et la vue d'origine. Cependant, si la requête sauvegardée contient une soumission de formulaire, elle passe au presenter d'origine via la méthode forward(), transmet les valeurs précédemment remplies au formulaire et le laisse se rendre à nouveau. L'utilisateur a ainsi la possibilité de soumettre à nouveau le formulaire et aucune donnée n'est perdue.

Il est important de noter que restoreRequest() vérifie si l'utilisateur nouvellement connecté est le même que celui qui a initialement rempli le formulaire. Si ce n'est pas le cas, elle rejette la requête et ne fait rien.

Illustrons tout cela par un exemple. Supposons que nous ayons un presenter AdminPresenter, dans lequel des données sont éditées et dans la méthode startup() duquel nous vérifions si l'utilisateur est connecté. S'il ne l'est pas, nous le redirigeons vers SignPresenter. En même temps, nous sauvegardons la requête actuelle et envoyons sa clé à SignPresenter.

class AdminPresenter extends Nette\Application\UI\Presenter
{
	protected function startup()
	{
		parent::startup();

		if (!$this->user->isLoggedIn()) {
			$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
		}
	}
}

Le presenter SignPresenter contiendra, en plus du formulaire de connexion, un paramètre persistant $backlink, dans lequel la clé sera écrite. Comme le paramètre est persistant, il sera également transmis après la soumission du formulaire de connexion.

use Nette\Application\Attributes\Persistent;

class SignPresenter extends Nette\Application\UI\Presenter
{
	#[Persistent]
	public string $backlink = '';

	protected function createComponentSignInForm()
	{
		$form = new Nette\Application\UI\Form;
		// ... ajouter les champs du formulaire ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

	public function signInFormSubmitted($form)
	{
		// ... ici, nous connectons l'utilisateur ...

		$this->restoreRequest($this->backlink);
		$this->redirect('Admin:');
	}
}

Nous passons la clé de la requête sauvegardée à la méthode restoreRequest() et elle redirige (ou avance) vers le presenter d'origine.

Cependant, si la clé n'est pas valide (par exemple, elle n'existe plus dans la session), la méthode ne fait rien. L'appel $this->redirect('Admin:') suit donc, qui redirige vers AdminPresenter.