Wie man zu einer früheren Seite zurückkehrt?
Was passiert, wenn ein Benutzer gerade ein Formular ausfüllt und seine Anmeldung abläuft? Damit die Daten nicht verloren gehen, speichern wir den aktuellen Request (samt Formulardaten) vor der Weiterleitung zur Anmeldeseite in der Session. In Nette ist das erstaunlich einfach.
Der aktuelle Request lässt sich mit der Methode storeRequest() in der Session speichern. Sie gibt einen
eindeutigen Bezeichner in Form eines kurzen Strings zurück. Die Methode speichert den Namen des aktuellen Presenters, dessen View
und dessen Parameter. Wurde als Teil des Requests auch ein Formular abgeschickt, werden zusätzlich die eingegebenen Feldwerte
gespeichert (mit Ausnahme hochgeladener Dateien).
Die Wiederherstellung des Requests übernimmt die Methode restoreRequest($key), der Sie den zuvor erhaltenen
Bezeichner übergeben. Sie leitet zurück zum ursprünglichen Presenter und View. Enthielt der gespeicherte Request jedoch das
Absenden eines Formulars, verwendet restoreRequest() statt der Weiterleitung die Methode forward(). Sie
übergibt dem Formular die zuvor eingegebenen Werte zurück und lässt es erneut rendern. Der Benutzer kann das Formular so noch
einmal absenden, ohne dass eingegebene Daten verloren gehen.
Wichtig ist, dass restoreRequest() prüft, ob der neu angemeldete Benutzer derselbe ist, der das Formular
ursprünglich abgeschickt hat. Ist es ein anderer, wird der gespeicherte Request nicht wiederhergestellt und die Methode tut
nichts, was die Sicherheit erhöht.
Zeigen wir das an einem Beispiel. Nehmen wir einen AdminPresenter, in dem Daten bearbeitet werden. In seiner
Methode startup() prüfen wir, ob der Benutzer angemeldet ist. Ist er es nicht, leiten wir ihn zum
SignPresenter weiter. Gleichzeitig speichern wir den aktuellen Request mit storeRequest() und übergeben
dessen Schlüssel (das $backlink) 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 SignPresenter enthält außer dem Anmeldeformular noch einen persistenten Parameter $backlink, in
den der Schlüssel geschrieben wird. Weil der Parameter persistent ist, bleibt sein Wert auch nach dem Absenden des
Anmeldeformulars erhalten.
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;
// ... wir fügen die Formularfelder hinzu ...
$form->onSuccess[] = $this->signInFormSuceeded(...);
return $form;
}
private function signInFormSuceeded($form)
{
// ... hier melden wir den Benutzer an ...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
Der Methode restoreRequest() übergeben wir den Schlüssel ($this->backlink) des gespeicherten
Requests. Sie leitet den Benutzer dann zum ursprünglichen Presenter und View weiter (oder springt dorthin).
Ist der Schlüssel jedoch ungültig (weil er zum Beispiel nicht mehr in der Session existiert), tut die Methode nichts. Der
anschließende Aufruf $this->redirect('Admin:') dient deshalb als Fallback und leitet auf eine Standardseite wie
den AdminPresenter weiter.