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
.
class AdminPresenter extends Nette\Application\UI\Presenter
{
protected function startup()
{
parent::startup();
if (!$this->user->isLoggedIn()) {
$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
}
}
}
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.
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;
// ... aggiungere i campi del modulo ...
$form->onSuccess[] = [$this, 'signInFormSubmitted'];
return $form;
}
public function signInFormSubmitted($form)
{
// ... qui registriamo l'utente...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
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
.