Как да се върна към предишната страница?

Какво трябва да направя, ако даден потребител е попълнил формуляра, но срокът му на влизане е изтекъл? За да избегнем загубата на данни, ги записваме в сесия, преди да пренасочим към страницата за вход. В 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.