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

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