Comment revenir à une page antérieure ?
Que faire si un utilisateur remplit un formulaire et que son identifiant expire ? Pour éviter de perdre les données, nous sauvegardons les données dans la session avant de rediriger vers la page de connexion. Avec Nette, c'est un jeu d'enfant.
La requête en cours peut être stockée dans la session à l'aide de la méthode storeRequest()
, qui renvoie son
identifiant sous la forme d'une courte chaîne. La méthode stocke le nom du présentateur actuel, la vue et ses paramètres. Si
un formulaire a également été soumis, les valeurs des champs (sauf pour les fichiers téléchargés) sont également
enregistrées.
La requête est restaurée par la méthode restoreRequest($key)
, à laquelle nous passons l'identifiant
récupéré. Cela redirige vers le présentateur et la vue d'origine. Toutefois, si la demande sauvegardée contient une
soumission de formulaire, elle est redirigée vers le présentateur d'origine à l'aide de la méthode forward()
,
transmet les valeurs précédemment remplies au formulaire et le laisse se redessiner. Cela permet à l'utilisateur de soumettre
à nouveau le formulaire et aucune donnée n'est perdue.
Il est important de noter que restoreRequest()
vérifie que l'utilisateur nouvellement connecté est le même que
celui qui a rempli le formulaire à l'origine. Si ce n'est pas le cas, il rejette la demande et ne fait rien.
Démontrons tout cela à l'aide d'un exemple. Ayons un présentateur AdminPresenter
dans lequel des données sont
modifiées et dont la méthode startup()
vérifie 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 en cours 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 présentateur SignPresenter
contiendra un paramètre persistant $backlink
dans lequel la clé est
écrite, en plus du formulaire de connexion. Comme le paramètre est persistant, il sera conservé même après l'envoi 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 signons l'utilisateur ...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
Nous passons la clé de la requête sauvegardée à la méthode restoreRequest()
et celle-ci redirige (ou
transmet) vers le présentateur d'origine.
Toutefois, si la clé n'est pas valide (par exemple, si elle n'existe plus dans la session), la méthode ne fait rien. L'appel
suivant est donc $this->redirect('Admin:')
, qui redirige vers AdminPresenter
.