Nette Documentation Preview

syntax
Wie kann man zu einer früheren Seite zurückkehren?
**************************************************

.[perex]
Was passiert, wenn ein Benutzer ein Formular ausfüllt und seine Anmeldung abläuft? Um zu vermeiden, dass die Daten verloren gehen, speichern wir die Daten in der Session, bevor wir zur Anmeldeseite weiterleiten. In Nette ist das ein Kinderspiel.

Die aktuelle Anfrage kann mit der Methode `storeRequest()` in der Session gespeichert werden, die ihre Kennung als kurze Zeichenkette zurückgibt. Die Methode speichert den Namen des aktuellen Präsentators, die Ansicht und ihre Parameter.
Wurde auch ein Formular abgeschickt, werden die Werte der Felder (mit Ausnahme der hochgeladenen Dateien) ebenfalls gespeichert.

Die Anfrage wird durch die Methode `restoreRequest($key)` wiederhergestellt, an die wir den abgerufenen Bezeichner übergeben. Diese leitet zum ursprünglichen Präsentator und zur ursprünglichen Ansicht zurück. Enthält die gespeicherte Anfrage jedoch eine Formularübermittlung, wird sie mit der Methode `forward()` an den ursprünglichen Präsentator weitergeleitet, wobei die zuvor ausgefüllten Werte an das Formular übergeben werden und dieses neu gezeichnet werden kann. So kann der Benutzer das Formular erneut abschicken, ohne dass Daten verloren gehen.

Wichtig ist, dass `restoreRequest()` überprüft, ob der neu angemeldete Benutzer derselbe ist, der das Formular ursprünglich ausgefüllt hat. Wenn nicht, wird die Anfrage verworfen und nichts unternommen.

Lassen Sie uns das Ganze anhand eines Beispiels demonstrieren. Nehmen wir einen Präsentator `AdminPresenter`, in dem Daten bearbeitet werden und dessen Methode `startup()` prüft, ob der Benutzer angemeldet ist. Ist dies nicht der Fall, leiten wir ihn zu `SignPresenter` um. Gleichzeitig speichern wir die aktuelle Anfrage und senden ihren Schlüssel an `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()]);
		}
	}
}
```

Der Präsentator `SignPresenter` enthält einen persistenten Parameter `$backlink`, in den der Schlüssel zusätzlich zum Anmeldeformular geschrieben wird. Da der Parameter persistent ist, wird er auch nach dem Absenden des Anmeldeformulars beibehalten.


```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;
		// ... Formularfelder hinzufügen ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

	public function signInFormSubmitted($form)
	{
		// ... hier melden wir den Benutzer an ...

		$this->restoreRequest($this->backlink);
		$this->redirect('Admin:');
	}
}
```

Wir übergeben den Schlüssel der gespeicherten Anfrage an die Methode `restoreRequest()` und diese leitet zum ursprünglichen Präsentator um (oder weiter).

Ist der Schlüssel jedoch ungültig (z. B. weil er in der Session nicht mehr existiert), unternimmt die Methode nichts. Der nächste Aufruf ist dann `$this->redirect('Admin:')`, der an `AdminPresenter` weiterleitet.

{{priority: -1}}
{{sitename: Bewährte Praktiken}}

Wie kann man zu einer früheren Seite zurückkehren?

Was passiert, wenn ein Benutzer ein Formular ausfüllt und seine Anmeldung abläuft? Um zu vermeiden, dass die Daten verloren gehen, speichern wir die Daten in der Session, bevor wir zur Anmeldeseite weiterleiten. In Nette ist das ein Kinderspiel.

Die aktuelle Anfrage kann mit der Methode storeRequest() in der Session gespeichert werden, die ihre Kennung als kurze Zeichenkette zurückgibt. Die Methode speichert den Namen des aktuellen Präsentators, die Ansicht und ihre Parameter. Wurde auch ein Formular abgeschickt, werden die Werte der Felder (mit Ausnahme der hochgeladenen Dateien) ebenfalls gespeichert.

Die Anfrage wird durch die Methode restoreRequest($key) wiederhergestellt, an die wir den abgerufenen Bezeichner übergeben. Diese leitet zum ursprünglichen Präsentator und zur ursprünglichen Ansicht zurück. Enthält die gespeicherte Anfrage jedoch eine Formularübermittlung, wird sie mit der Methode forward() an den ursprünglichen Präsentator weitergeleitet, wobei die zuvor ausgefüllten Werte an das Formular übergeben werden und dieses neu gezeichnet werden kann. So kann der Benutzer das Formular erneut abschicken, ohne dass Daten verloren gehen.

Wichtig ist, dass restoreRequest() überprüft, ob der neu angemeldete Benutzer derselbe ist, der das Formular ursprünglich ausgefüllt hat. Wenn nicht, wird die Anfrage verworfen und nichts unternommen.

Lassen Sie uns das Ganze anhand eines Beispiels demonstrieren. Nehmen wir einen Präsentator AdminPresenter, in dem Daten bearbeitet werden und dessen Methode startup() prüft, ob der Benutzer angemeldet ist. Ist dies nicht der Fall, leiten wir ihn zu SignPresenter um. Gleichzeitig speichern wir die aktuelle Anfrage und senden ihren Schlüssel an SignPresenter.

class AdminPresenter extends Nette\Application\UI\Presenter
{
	protected function startup()
	{
		parent::startup();

		if (!$this->user->isLoggedIn()) {
			$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
		}
	}
}

Der Präsentator SignPresenter enthält einen persistenten Parameter $backlink, in den der Schlüssel zusätzlich zum Anmeldeformular geschrieben wird. Da der Parameter persistent ist, wird er auch nach dem Absenden des Anmeldeformulars beibehalten.

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;
		// ... Formularfelder hinzufügen ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

	public function signInFormSubmitted($form)
	{
		// ... hier melden wir den Benutzer an ...

		$this->restoreRequest($this->backlink);
		$this->redirect('Admin:');
	}
}

Wir übergeben den Schlüssel der gespeicherten Anfrage an die Methode restoreRequest() und diese leitet zum ursprünglichen Präsentator um (oder weiter).

Ist der Schlüssel jedoch ungültig (z. B. weil er in der Session nicht mehr existiert), unternimmt die Methode nichts. Der nächste Aufruf ist dann $this->redirect('Admin:'), der an AdminPresenter weiterleitet.