Hogyan térhetek vissza egy korábbi oldalra?

Mi történik, ha egy felhasználó kitölt egy űrlapot, és a bejelentkezése lejár? Az adatok elvesztésének elkerülése érdekében a bejelentkezési oldalra való átirányítás előtt elmentjük az adatokat a munkamenetbe. A Nette-ben ez gyerekjáték.

Az aktuális kérést a munkamenetben tárolhatjuk a storeRequest() metódus segítségével, amely rövid sztringként adja vissza az azonosítóját. A metódus tárolja az aktuális bemutató nevét, a nézetet és annak paramétereit. Ha egy űrlapot is elküldtünk, akkor a mezők értékei (a feltöltött fájlok kivételével) szintén elmentésre kerülnek.

A kérést a restoreRequest($key) metódus állítja vissza, amelynek átadjuk a visszakapott azonosítót. Ez átirányít az eredeti prezenterre és nézetre. Ha azonban a mentett kérés űrlapbeadást tartalmaz, akkor a forward() metódussal továbbítjuk az eredeti prezenterhez, átadjuk az űrlapnak a korábban kitöltött értékeket, és hagyjuk, hogy újra kirajzolódjon. Ez lehetővé teszi, hogy a felhasználó újra elküldje az űrlapot, és nem vesznek el adatok.

Fontos, hogy a restoreRequest() ellenőrzi, hogy az újonnan bejelentkezett felhasználó ugyanaz-e, aki eredetileg kitöltötte az űrlapot. Ha nem, akkor elveti a kérést, és nem tesz semmit.

Mutassuk be mindezt egy példával. Legyen egy prezenterünk AdminPresenter, amelyben adatokat szerkesztünk, és amelynek startup() metódusa ellenőrzi, hogy a felhasználó be van-e jelentkezve. Ha nem, akkor átirányítjuk a SignPresenter címre. Ezzel egyidejűleg elmentjük az aktuális kérést, és elküldjük a kulcsát a SignPresenter címre.

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

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

A SignPresenter prezenter a bejelentkezési űrlapon kívül tartalmazni fog egy állandó $backlink paramétert, amelyre a kulcsot írjuk. Mivel a paraméter állandó, a bejelentkezési űrlap elküldése után is átkerül.

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;
		// ... űrlapmezők hozzáadása ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

	public function signInFormSubmitted($form)
	{
		// ... itt bejelentkezik a felhasználó ...

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

A mentett kérés kulcsát átadjuk a restoreRequest() metódusnak, és az átirányít (vagy továbbít) az eredeti bemutatóhoz.

Ha azonban a kulcs érvénytelen (például már nem létezik a munkamenetben), a módszer nem tesz semmit. Így a következő hívás a $this->redirect('Admin:'), amely átirányít a AdminPresenter címre.