Як повернутися на попередню сторінку?

Що робити, якщо користувач заповнює форму, а його сесія закінчується? Щоб дані не були втрачені, перед перенаправленням на сторінку входу ми збережемо дані в сесії. У Nette це зовсім просто.

Поточний запит можна зберегти в сесії за допомогою методу storeRequest(), який поверне його ідентифікатор у вигляді короткого рядка. Метод зберігає назву поточного презентера, view та його параметри. У випадку, якщо була надіслана форма, також зберігається вміст полів (за винятком завантажених файлів).

Відновлення запиту виконує метод restoreRequest($key), якому ми передаємо отриманий ідентифікатор. Він перенаправляє на початковий презентер та view. Однак, якщо збережений запит містить надсилання форми, на початковий презентер він перейде методом 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.