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