Cum să reveniți la pagina anterioară?
Ce se întâmplă dacă un utilizator completează un formular și sesiunea sa expiră? Pentru a nu pierde datele, înainte de a redirecționa către pagina de autentificare, salvăm cererea curentă în sesiune. În Nette, acest lucru este extrem de simplu.
Cererea curentă poate fi salvată în sesiune folosind metoda storeRequest()
, care returnează identificatorul
său sub forma unui șir scurt. Metoda salvează numele presenterului curent, view-ul și parametrii săi. În cazul în care a
fost trimis și un formular, se salvează și conținutul câmpurilor (cu excepția fișierelor încărcate).
Restaurarea cererii se face prin metoda restoreRequest($key)
, căreia îi transmitem identificatorul obținut.
Aceasta redirecționează către presenterul și view-ul original. Dacă însă cererea salvată conține trimiterea unui
formular, trece la presenterul original prin metoda forward()
, transmite formularului valorile completate anterior
și îl lasă să se redeseneze din nou. Astfel, utilizatorul are posibilitatea de a retrimite formularul și nu se
pierd date.
Important este că restoreRequest()
verifică dacă utilizatorul nou autentificat este același cu cel care a
completat inițial formularul. Dacă nu, cererea este abandonată și nu se face nimic.
Vom ilustra totul cu un exemplu. Avem un presenter AdminPresenter
, în care se editează date și în a cărui
metodă startup()
verificăm dacă utilizatorul este autentificat. Dacă nu este, îl redirecționăm către
SignPresenter
. În același timp, salvăm cererea curentă și trimitem cheia sa (backlink
) 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()]);
}
}
}
Presenterul SignPresenter
va conține, pe lângă formularul de autentificare, și un parametru persistent
$backlink
, în care se va scrie cheia. Deoarece parametrul este persistent, acesta se va transmite și după
trimiterea formularului de autentificare.
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ăugăm câmpurile formularului ...
$form->onSuccess[] = [$this, 'signInFormSubmitted'];
return $form;
}
public function signInFormSubmitted($form)
{
// ... aici autentificăm utilizatorul ...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
Metodei restoreRequest()
îi transmitem cheia cererii salvate și aceasta redirecționează (sau trece) la
presenterul original.
Dacă însă cheia este invalidă (de exemplu, nu mai există în sesiune), metoda nu face nimic. Urmează deci apelul
$this->redirect('Admin:')
, care redirecționează către AdminPresenter
.