Πώς να επιστρέψω σε μια προηγούμενη σελίδα;

Τι γίνεται αν ένας χρήστης συμπληρώσει μια φόρμα και η σύνδεσή του λήξει; Για να μην χαθούν τα δεδομένα, αποθηκεύουμε τα δεδομένα στη σύνοδο πριν από την ανακατεύθυνση στη σελίδα σύνδεσης. Στη Nette, αυτό είναι πανεύκολο.

Η τρέχουσα αίτηση μπορεί να αποθηκευτεί στη σύνοδο χρησιμοποιώντας τη μέθοδο storeRequest(), η οποία επιστρέφει το αναγνωριστικό της ως σύντομο αλφαριθμητικό. Η μέθοδος αποθηκεύει το όνομα του τρέχοντος παρουσιαστή, την προβολή και τις παραμέτρους της. Εάν υποβλήθηκε επίσης μια φόρμα, αποθηκεύονται επίσης οι τιμές των πεδίων (εκτός από τα αρχεία που έχουν μεταφορτωθεί).

Η αίτηση αποκαθίσταται από τη μέθοδο restoreRequest($key), στην οποία περνάμε το ανακτηθέν αναγνωριστικό. Αυτή ανακατευθύνει στον αρχικό παρουσιαστή και στην αρχική προβολή. Ωστόσο, αν το αποθηκευμένο αίτημα περιέχει υποβολή φόρμας, θα προωθηθεί στον αρχικό παρουσιαστή με τη μέθοδο forward(), θα περάσει τις προηγουμένως συμπληρωμένες τιμές στη φόρμα και θα αφήσει να επανασχεδιαστεί. Αυτό επιτρέπει στον χρήστη να υποβάλει εκ νέου τη φόρμα και δεν χάνονται δεδομένα.

Είναι σημαντικό ότι το restoreRequest() ελέγχει ότι ο νεοεισερχόμενος χρήστης είναι ο ίδιος που συμπλήρωσε αρχικά τη φόρμα. Εάν όχι, απορρίπτει την αίτηση και δεν κάνει τίποτα.

Ας δείξουμε τα πάντα με ένα παράδειγμα. Ας έχουμε έναν παρουσιαστή 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()]);
		}
	}
}

Ο παρουσιαστής SignPresenter θα περιέχει μια μόνιμη παράμετρο $backlink στην οποία γράφεται το κλειδί, εκτός από τη φόρμα σύνδεσης. Δεδομένου ότι η παράμετρος είναι μόνιμη, θα μεταφέρεται ακόμη και μετά την υποβολή της φόρμας σύνδεσης.

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() και αυτή ανακατευθύνει (ή προωθεί) στον αρχικό παρουσιαστή.

Ωστόσο, αν το κλειδί είναι άκυρο (για παράδειγμα, δεν υπάρχει πλέον στη σύνοδο), η μέθοδος δεν κάνει τίποτα. Έτσι, η επόμενη κλήση είναι η $this->redirect('Admin:'), η οποία ανακατευθύνει στο AdminPresenter.