Wie man zu einer früheren Seite zurückkehrt?
Was, wenn ein Benutzer ein Formular ausfüllt und seine Anmeldung abläuft? Damit er die Daten nicht verliert, speichern wir sie vor der Weiterleitung zur Anmeldeseite in der Session. In Nette ist das ein Kinderspiel.
Die aktuelle Anfrage kann mit der Methode storeRequest()
in der Session gespeichert werden, die ihren Bezeichner
in Form einer kurzen Zeichenkette zurückgibt. Die Methode speichert den Namen des aktuellen Presenters, die View und ihre
Parameter. Falls auch ein Formular gesendet wurde, wird auch der Inhalt der Felder gespeichert (mit Ausnahme von hochgeladenen
Dateien).
Die Wiederherstellung der Anfrage erfolgt durch die Methode restoreRequest($key)
, der wir den erhaltenen
Bezeichner übergeben. Diese leitet zum ursprünglichen Presenter und zur View weiter. Wenn die gespeicherte Anfrage jedoch das
Senden eines Formulars enthält, wechselt sie zum ursprünglichen Presenter mit der Methode forward()
, übergibt dem
Formular die zuvor ausgefüllten Werte und lässt es erneut rendern. Der Benutzer hat so die Möglichkeit, das Formular erneut zu
senden, und es gehen keine Daten verloren.
Wichtig ist, dass restoreRequest()
überprüft, ob der neu angemeldete Benutzer derselbe ist, der das Formular
ursprünglich ausgefüllt hat. Wenn nicht, verwirft sie die Anfrage und tut nichts.
Zeigen wir alles an einem Beispiel. Wir haben einen Presenter AdminPresenter
, in dem Daten bearbeitet werden und
in dessen Methode startup()
wir überprüfen, ob der Benutzer angemeldet ist. Wenn nicht, leiten wir ihn zum
SignPresenter
weiter. Gleichzeitig speichern wir die aktuelle Anfrage und senden ihren Schlüssel an den
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 Presenter SignPresenter
enthält neben dem Anmeldeformular auch einen persistenten Parameter
$backlink
, in den der Schlüssel geschrieben wird. Da der Parameter persistent ist, wird er auch nach dem Absenden
des Anmeldeformulars übertragen.
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 den Benutzer anmelden ...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
Wir übergeben der Methode restoreRequest()
den Schlüssel der gespeicherten Anfrage, und sie leitet (oder
wechselt per forward()
) zum ursprünglichen Presenter weiter.
Wenn der Schlüssel jedoch ungültig ist (z. B. nicht mehr in der Session existiert oder der Benutzer nicht übereinstimmt),
tut die Methode nichts. Es folgt also der Aufruf $this->redirect('Admin:')
, der zum AdminPresenter
(oder einer anderen Standardseite nach dem Login) weiterleitet.