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.