Nette Documentation Preview

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

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

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

Запит відновлюється методом `restoreRequest($key)`, якому ми передаємо витягнутий ідентифікатор. Це перенаправляє до вихідного презентера та подання. Однак, якщо збережений запит містить форму відправки, він буде перенаправлений до початкового презентера, використовуючи метод `forward()`, передайте раніше заповнені значення у форму і дозвольте їй перемалюватися. Це дозволяє користувачеві повторно надіслати форму, і дані не будуть втрачені.

Важливо зазначити, що `restoreRequest()` перевіряє, що користувач, який знову увійшов, є тим самим, який спочатку заповнив форму. Якщо ні, він відкидає запит і нічого не робить.

Давайте продемонструємо все на прикладі. Нехай у нас є презентер `AdminPresenter`, в якому редагуються дані і метод якого `startup()` перевіряє, чи увійшов користувач у систему. Якщо це не так, ми перенаправляємо його на `SignPresenter`. Водночас, ми зберігаємо поточний запит і відправляємо його ключ у `SignPresenter`.

```php
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`, в який записується ключ, на додаток до форми входу в систему. Оскільки параметр є постійним, він буде перенесений навіть після надсилання форми входу.


```php
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`.

{{priority: -1}}
{{sitename: Найкращі практики}}

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

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