Kako se vrniti na prejšnjo stran?
Kaj če uporabnik izpolnjuje obrazec in mu poteče prijava? Da ne bi izgubil podatkov, pred preusmeritvijo na prijavno stran podatke shranimo v sejo (session). V Nette je to povsem enostavno.
Trenutno zahtevo lahko shranite v sejo s pomočjo metode storeRequest()
, ki vrne njen identifikator v obliki
kratkega niza. Metoda shrani ime trenutnega presenterja, pogled (view) in njegove parametre. V primeru, da je bil poslan tudi
obrazec, se shrani tudi vsebina polj (z izjemo naloženih datotek).
Obnovitev zahteve izvede metoda restoreRequest($key)
, ki ji posredujemo pridobljeni identifikator. Ta preusmeri na
prvotni presenter in pogled. Če pa shranjena zahteva vsebuje pošiljanje obrazca, na prvotni presenter preide z metodo
forward()
, obrazcu posreduje prej izpolnjene vrednosti in ga pusti ponovno izrisati. Uporabnik ima tako možnost
obrazec ponovno poslati in nobeni podatki se ne izgubijo.
Pomembno je, da restoreRequest()
preveri, ali je novo prijavljeni uporabnik isti, kot tisti, ki je obrazec prvotno
izpolnjeval. Če ne, zahtevo zavrže in ne naredi ničesar.
Poglejmo si vse na primeru. Imejmo presenter AdminPresenter
, v katerem se urejajo podatki in v njegovi metodi
startup()
preverjamo, ali je uporabnik prijavljen. Če ni, ga preusmerimo na SignPresenter
. Hkrati
shranimo trenutno zahtevo in njen ključ pošljemo v SignPresenter
.
class AdminPresenter extends Nette\Application\UI\Presenter
{
protected function startup()
{
parent::startup();
if (!$this->user->isLoggedIn()) {
$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
}
}
}
Presenter SignPresenter
bo poleg obrazca za prijavo vseboval tudi persistentni parameter $backlink
,
v katerega se zapiše ključ. Ker je parameter persistenten, se bo prenašal tudi po pošiljanju prijavnega obrazca.
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;
// ... dodamo polja obrazca ...
$form->onSuccess[] = [$this, 'signInFormSubmitted'];
return $form;
}
public function signInFormSubmitted($form)
{
// ... tukaj uporabnika prijavimo ...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
Metodi restoreRequest()
posredujemo ključ shranjene zahteve in ta preusmeri (ali preide) na prvotni
presenter.
Če pa je ključ neveljaven (na primer že ne obstaja v seji), metoda ne naredi ničesar. Sledi torej klic
$this->redirect('Admin:')
, ki preusmeri na AdminPresenter
.