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
.