Как вернуться на предыдущую страницу?
Что делать, если пользователь заполнил форму, а срок действия его логина истек? Чтобы избежать потери данных, мы сохраняем их в сессии перед перенаправлением на страницу входа в систему. В Nette это проще простого.
Текущий запрос может быть сохранен в сессии с помощью метода
storeRequest()
, который возвращает его идентификатор в виде короткой
строки. Метод сохраняет имя текущего презентера, представление и его
параметры. Если форма также была отправлена, значения полей (за
исключением загруженных файлов) также сохраняются.
Запрос восстанавливается методом restoreRequest($key)
, которому мы
передаем извлеченный идентификатор. Это перенаправляет к исходному
презентеру и представлению. Однако, если сохраненный запрос содержит
форму отправки, он будет перенаправлен первоначальному презентеру,
используя метод forward()
, передайте ранее заполненные значения в
форму и позвольте ей перерисоваться. Это позволяет пользователю
повторно отправить форму, и данные не будут потеряны.
Важно отметить, что restoreRequest()
проверяет, что вновь вошедший
пользователь является тем же самым, который первоначально заполнил
форму. Если нет, он отбрасывает запрос и ничего не делает.
Давайте продемонстрируем всё на примере. Пусть у нас есть презентер
AdminPresenter
, в котором редактируются данные и метод которого
startup()
проверяет, вошел ли пользователь в систему. Если это не
так, мы перенаправляем его на SignPresenter
. В то же время, мы сохраняем
текущий запрос и отправляем его ключ в SignPresenter
.
Презентер SignPresenter
будет содержать постоянный параметр
$backlink
, в который записывается ключ, в дополнение к форме входа в
систему. Поскольку параметр является постоянным, он будет перенесен
даже после отправки формы входа.
Мы передаем ключ сохраненного запроса методу restoreRequest()
, и он
перенаправляет (или переадресует) к исходному презентеру.
Однако, если ключ недействителен (например, больше не существует в
сессии), метод ничего не делает. Поэтому следующим вызовом будет
$this->redirect('Admin:')
, который перенаправляет на AdminPresenter
.