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