Nette Documentation Preview

syntax
Comment revenir à une page antérieure ?
***************************************

.[perex]
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`.

```php
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.


```php
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`.

{{priority: -1}}
{{sitename: Meilleures pratiques}}

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.