Πώς να επιστρέψετε σε προηγούμενη σελίδα;
Τι γίνεται αν ο χρήστης συμπληρώνει μια φόρμα και η σύνδεσή του λήξει; Για να μην χάσει τα δεδομένα, πριν την ανακατεύθυνση στη σελίδα σύνδεσης, αποθηκεύουμε τα δεδομένα στο session. Στο Nette αυτό είναι παιχνιδάκι.
Το τρέχον αίτημα μπορεί να αποθηκευτεί στο session χρησιμοποιώντας τη
μέθοδο storeRequest()
, η οποία επιστρέφει το αναγνωριστικό του με τη
μορφή ενός σύντομου string. Η μέθοδος αποθηκεύει το όνομα του τρέχοντος
presenter, την προβολή και τις παραμέτρους του. Σε περίπτωση που έχει
υποβληθεί και φόρμα, αποθηκεύεται επίσης το περιεχόμενο των πεδίων (με
εξαίρεση τα ανεβασμένα αρχεία).
Η επαναφορά του αιτήματος γίνεται με τη μέθοδο restoreRequest($key)
,
στην οποία περνάμε το ληφθέν αναγνωριστικό. Αυτή ανακατευθύνει στον
αρχικό presenter και προβολή. Αν όμως το αποθηκευμένο αίτημα περιέχει
υποβολή φόρμας, μεταβαίνει στον αρχικό presenter με τη μέθοδο forward()
,
παραδίδει στη φόρμα τις προηγουμένως συμπληρωμένες τιμές και την
αφήνει να αποδοθεί ξανά. Ο χρήστης έτσι έχει τη δυνατότητα να υποβάλει
ξανά τη φόρμα και κανένα δεδομένο δεν χάνεται.
Σημαντικό είναι ότι το restoreRequest()
ελέγχει αν ο νέος
συνδεδεμένος χρήστης είναι ο ίδιος που συμπλήρωσε αρχικά τη φόρμα. Αν
όχι, απορρίπτει το αίτημα και δεν κάνει τίποτα.
Θα δείξουμε τα πάντα με ένα παράδειγμα. Έστω ότι έχουμε έναν presenter
AdminPresenter
, στον οποίο επεξεργαζόμαστε δεδομένα και στη μέθοδο
startup()
του οποίου ελέγχουμε αν ο χρήστης είναι συνδεδεμένος. Αν
δεν είναι, τον ανακατευθύνουμε στον SignPresenter
. Ταυτόχρονα
αποθηκεύουμε το τρέχον αίτημα και στέλνουμε το κλειδί του στον
SignPresenter
.
class AdminPresenter extends Nette\Application\UI\Presenter
{
protected function startup()
{
parent::startup();
if (!$this->user->isLoggedIn()) {
$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
}
}
}
Ο presenter SignPresenter
θα περιέχει εκτός από τη φόρμα σύνδεσης και μια
persistent παράμετρο $backlink
, στην οποία θα γραφτεί το κλειδί. Επειδή η
παράμετρος είναι persistent, θα μεταφέρεται και μετά την υποβολή της φόρμας
σύνδεσης.
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;
// ... προσθέτουμε πεδία φόρμας ...
$form->onSuccess[] = [$this, 'signInFormSubmitted'];
return $form;
}
public function signInFormSubmitted($form)
{
// ... εδώ συνδέουμε τον χρήστη ...
$this->restoreRequest($this->backlink);
$this->redirect('Admin:');
}
}
Στη μέθοδο restoreRequest()
περνάμε το κλειδί του αποθηκευμένου
αιτήματος και αυτή ανακατευθύνει (ή μεταβαίνει) στον αρχικό presenter.
Αν όμως το κλειδί είναι άκυρο (για παράδειγμα δεν υπάρχει πλέον στο
session), η μέθοδος δεν κάνει τίποτα. Ακολουθεί επομένως η κλήση
$this->redirect('Admin:')
, η οποία ανακατευθύνει στον AdminPresenter
.