Önceki Sayfaya Nasıl Dönülür?

Kullanıcı bir formu doldururken oturumunun süresi dolarsa ne olur? Veri kaybını önlemek için, giriş sayfasına yönlendirmeden önce geçerli isteği (form verileriyle birlikte) oturuma kaydedebiliriz. Nette'de bu şaşırtıcı derecede kolaydır.

Geçerli istek, storeRequest() metoduyla oturuma saklanabilir. Bu metot, saklanan istek için benzersiz bir tanımlayıcı (kısa bir dize) döndürür. Metot, geçerli presenter'ın adını, view'ını ve parametrelerini kaydeder. İsteğin bir parçası olarak bir form gönderilmişse, alanlara girilen değerler (yüklenen dosyalar hariç) de kaydedilir.

İstek, daha önce alınan tanımlayıcıyı verdiğiniz restoreRequest($key) metoduyla geri yüklenir. Bu metot, kullanıcıyı özgün presenter ve view'a geri yönlendirir. Ancak saklanan istek bir form gönderimi içeriyorsa, restoreRequest() yönlendirme yerine forward() metodunu kullanır. Daha önce doldurulmuş değerleri forma geri aktarır ve yeniden render edilmesini sağlar. Böylece kullanıcı, girdiği verileri kaybetmeden formu yeniden gönderebilir.

Çok önemli bir nokta: restoreRequest(), yeni oturum açan kullanıcının formu özgün olarak gönderen kullanıcıyla aynı olduğunu doğrular. Kullanıcı farklıysa saklanan istek geri yüklenmez ve metot hiçbir şey yapmaz; bu da güvenliği artırır.

Bunu bir örnekle gösterelim. Verilerin düzenlendiği bir AdminPresenter düşünün. startup() metodu kullanıcının oturum açıp açmadığını doğrular. Açmamışsa kullanıcı SignPresenter'a yönlendirilir. Aynı anda geçerli isteği storeRequest() ile saklarız ve anahtarını ($backlink) SignPresenter'a aktarırız.

class AdminPresenter extends Nette\Application\UI\Presenter
{
	protected function startup()
	{
		parent::startup();

		if (!$this->user->isLoggedIn()) {
			$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
		}
	}
}

SignPresenter, giriş formunun yanı sıra anahtarın saklandığı kalıcı bir $backlink parametresi içerir. Parametre kalıcı olduğundan, değeri giriş formu gönderildikten sonra da korunur.

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 alanlarını ekle ...
		$form->onSuccess[] = $this->signInFormSuceeded(...);
		return $form;
	}

	private function signInFormSuceeded($form)
	{
		// ... kullanıcının oturumunu burada aç ...

		$this->restoreRequest($this->backlink);
		$this->redirect('Admin:');
	}
}

Saklanan isteğin anahtarını ($this->backlink) restoreRequest() metoduna veririz. Metot da kullanıcıyı özgün presenter ve view'a geri yönlendirir (ya da forward eder).

Ancak anahtar geçersizse (örneğin oturumdan düşmüşse) metot hiçbir şey yapmaz. Bu yüzden ardından gelen $this->redirect('Admin:') çağrısı bir yedek görevi görür ve AdminPresenter gibi varsayılan bir sayfaya yönlendirir.