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.