Come tornare alla pagina precedente?
Cosa succede se un utente sta compilando un modulo e la sua sessione scade? Per evitare la perdita di dati, salviamo i dati nella sessione prima di reindirizzare alla pagina di login. In Nette, questo è un gioco da ragazzi.
La richiesta corrente può essere salvata nella sessione tramite il metodo storeRequest()
, che restituisce il suo
identificatore sotto forma di una breve stringa. Il metodo salva il nome del presenter corrente, la vista e i suoi parametri. Nel
caso in cui sia stato inviato anche un modulo, verranno salvati anche i contenuti dei campi (ad eccezione dei file caricati).
Il ripristino della richiesta viene eseguito dal metodo restoreRequest($key)
, al quale passiamo l'identificatore
ottenuto. Questo reindirizza al presenter e alla vista originali. Tuttavia, se la richiesta salvata contiene l'invio di un modulo,
passerà al presenter originale tramite il metodo forward()
, passerà al modulo i valori precedentemente compilati e
lo farà renderizzare nuovamente. L'utente ha così la possibilità di inviare nuovamente il modulo e nessun dato
andrà perso.
È importante notare che restoreRequest()
controlla se l'utente appena loggato è lo stesso che ha compilato
originariamente il modulo. In caso contrario, scarta la richiesta e non fa nulla.
Mostriamo tutto con un esempio. Abbiamo un presenter AdminPresenter
, in cui si modificano i dati e nel cui metodo
startup()
verifichiamo se l'utente è loggato. In caso contrario, lo reindirizziamo a SignPresenter
.
Allo stesso tempo, salviamo la richiesta corrente e inviamo la sua chiave a SignPresenter
.
class AdminPresenter extends Nette\Application\UI\Presenter
{
protected function startup()
{
parent::startup();
if (!$this->user->isLoggedIn()) {
$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
}
}
}
Il presenter SignPresenter
conterrà, oltre al modulo di login, anche un parametro persistente
$backlink
, in cui verrà scritta la chiave. Poiché il parametro è persistente, verrà trasmesso anche dopo l'invio
del modulo di login.
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;
// ... aggiungiamo i campi del modulo ...
$form->onSuccess[] = [$this, 'signInFormSubmitted'];
return $form;
}
public function signInFormSubmitted($form)
{
// ... qui effettuiamo il login dell'utente ...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
Al metodo restoreRequest()
passiamo la chiave della richiesta salvata e questo reindirizza (o passa) al presenter
originale.
Tuttavia, se la chiave non è valida (ad esempio, non esiste più nella sessione), il metodo non fa nulla. Segue quindi la
chiamata $this->redirect('Admin:')
, che reindirizza a AdminPresenter
.