Hogyan térjünk vissza egy korábbi oldalra?
Mi van, ha a felhasználó egy űrlapot tölt ki, és lejár a bejelentkezése? Hogy ne vesszenek el az adatok, a bejelentkezési oldalra történő átirányítás előtt az adatokat a sessionbe mentjük. A Nette-ben ez gyerekjáték.
Az aktuális kérést a storeRequest()
metódussal lehet a sessionbe menteni, amely visszaadja annak
azonosítóját egy rövid string formájában. A metódus elmenti az aktuális presenter nevét, a view-t és annak
paramétereit. Abban az esetben, ha egy űrlap is elküldésre került, a mezők tartalma is elmentésre kerül (a feltöltött
fájlok kivételével).
A kérés visszaállítását a restoreRequest($key)
metódus végzi, amelynek átadjuk a kapott azonosítót. Ez
átirányít az eredeti presenterhez és view-hoz. Ha azonban a mentett kérés egy űrlap elküldését tartalmazza, akkor az
eredeti presenterhez a forward()
metódussal lép át, átadja az űrlapnak a korábban kitöltött értékeket, és
újra kirajzoltatja azt. Így a felhasználónak lehetősége van újra elküldeni 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, eldobja a kérést, és nem tesz semmit.
Mutassuk be mindezt egy példán. Legyen egy AdminPresenter
presenterünk, amelyben adatokat szerkesztünk, és
amelynek startup()
metódusában ellenőrizzük, hogy a felhasználó be van-e jelentkezve. Ha nincs, átirányítjuk
a SignPresenter
-re. Ezzel egyidejűleg elmentjük az aktuális kérést, és annak kulcsát elküldjük a
SignPresenter
-nek.
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
a bejelentkezési űrlapon kívül tartalmazni fog egy $backlink
perzisztens
paramétert is, amelybe a kulcs beíródik. Mivel a paraméter perzisztens, a bejelentkezési űrlap elküldése után is
átadásra kerü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;
// ... hozzáadjuk az űrlap mezőit ...
$form->onSuccess[] = [$this, 'signInFormSubmitted'];
return $form;
}
public function signInFormSubmitted($form)
{
// ... itt bejelentkeztetjük a felhasználót ...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
A restoreRequest()
metódusnak átadjuk a mentett kérés kulcsát, és az átirányít (vagy átlép) az eredeti
presenterhez.
Ha azonban a kulcs érvénytelen (például már nem létezik a sessionben), a metódus nem tesz semmit. Ezt követi a
$this->redirect('Admin:')
hívása, amely átirányít az AdminPresenter
-re.