Nette Documentation Preview

syntax
Come tornare a una pagina precedente?
*************************************

.[perex]
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`.

```php
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.


```php
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`.

{{priority: -1}}
{{sitename: Migliori pratiche}}

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.