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
.