Cum să vă întoarceți la o pagină anterioară?

Ce se întâmplă dacă un utilizator completează un formular și îi expiră autentificarea? Pentru a evita pierderea datelor, salvăm datele în sesiune înainte de a le redirecționa către pagina de autentificare. În Nette, acest lucru este floare la ureche.

Cererea curentă poate fi stocată în sesiune folosind metoda storeRequest(), care returnează identificatorul acesteia sub forma unui șir scurt. Metoda stochează numele prezentatorului curent, vizualizarea și parametrii acesteia. Dacă a fost trimis și un formular, sunt salvate și valorile câmpurilor (cu excepția fișierelor încărcate).

Cererea este restaurată de metoda restoreRequest($key), căreia îi transmitem identificatorul recuperat. Aceasta redirecționează către prezentatorul și vizualizarea originale. Cu toate acestea, în cazul în care cererea salvată conține o trimitere de formular, se redirecționează către prezentatorul original prin metoda forward(), se trec valorile completate anterior în formular și se lasă să fie redesenat. Acest lucru permite utilizatorului să retrimită formularul și nu se pierd date.

Este important faptul că restoreRequest() verifică dacă utilizatorul nou conectat este același care a completat inițial formularul. În caz contrar, acesta respinge cererea și nu face nimic.

Să demonstrăm totul cu un exemplu. Să avem un prezentator AdminPresenter în care se editează date și a cărui metodă startup() verifică dacă utilizatorul este logat. Dacă nu este, îl redirecționăm către SignPresenter. În același timp, salvăm cererea curentă și trimitem cheia acesteia către SignPresenter.

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

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

Prezentatorul SignPresenter va conține un parametru persistent $backlink în care este scrisă cheia, în plus față de formularul de logare. Deoarece parametrul este persistent, acesta va fi păstrat chiar și după trimiterea formularului de conectare.

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;
		// ... adăugați câmpuri de formular ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

	public function signInFormSubmitted($form)
	{
		// ... aici semnăm intrarea utilizatorului ...

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

Trecem cheia cererii salvate la metoda restoreRequest(), iar aceasta redirecționează (sau transmite) către prezentatorul original.

Cu toate acestea, dacă cheia nu este validă (de exemplu, nu mai există în sesiune), metoda nu face nimic. Așadar, următorul apel este $this->redirect('Admin:'), care redirecționează către AdminPresenter.