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.