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