Як повернутися на попередню сторінку?
Що робити, якщо користувач заповнює форму, а його сесія закінчується? Щоб дані не були втрачені, перед перенаправленням на сторінку входу ми збережемо дані в сесії. У 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
.