Come tornare a una pagina precedente?
Cosa succede se un utente compila un modulo e il suo login scade? Per evitare di perdere i dati, li salviamo nella sessione prima di reindirizzare alla pagina di login. In Nette, questo è un gioco da ragazzi.
La richiesta corrente può essere memorizzata nella sessione utilizzando il metodo storeRequest()
, che restituisce
il suo identificatore come una breve stringa. Il metodo memorizza il nome del presentatore corrente, la vista e i suoi parametri.
Se è stato inviato anche un modulo, vengono salvati anche i valori dei campi (tranne quelli dei file caricati).
La richiesta viene ripristinata dal metodo restoreRequest($key)
, al quale viene passato l'identificatore
recuperato. Questo reindirizza al presentatore e alla vista originali. Tuttavia, se la richiesta salvata contiene l'invio di un
modulo, viene inoltrata al presentatore originale con il metodo forward()
, passando i valori precedentemente
compilati al modulo e lasciando che venga ridisegnato. In questo modo, l'utente può inviare nuovamente il modulo senza perdere
alcun dato.
È importante che restoreRequest()
verifichi che l'utente appena entrato sia lo stesso che ha compilato il modulo
in origine. In caso contrario, scarta la richiesta e non fa nulla.
Dimostriamo tutto con un esempio. Abbiamo un presenter AdminPresenter
in cui si stanno modificando dei dati e il
cui metodo startup()
controlla se l'utente è connesso. Se non lo è, lo reindirizziamo a SignPresenter
.
Allo stesso tempo, salviamo la richiesta corrente e inviamo la sua chiave a SignPresenter
.
Il presentatore SignPresenter
conterrà un parametro persistente $backlink
in cui viene scritta la
chiave, oltre al modulo di login. Poiché il parametro è persistente, verrà mantenuto anche dopo l'invio del modulo
di login.
Si passa la chiave della richiesta salvata al metodo restoreRequest()
e questo rinvia (o inoltra) al presentatore
originale.
Tuttavia, se la chiave non è valida (per esempio, non esiste più nella sessione), il metodo non fa nulla. Quindi la chiamata
successiva è $this->redirect('Admin:')
, che reindirizza a AdminPresenter
.