Önceki bir sayfaya nasıl dönülür?

Bir kullanıcı bir form doldururken oturumu sona ererse ne olur? Verilerini kaybetmemek için, oturum açma sayfasına yönlendirmeden önce verileri oturumda saklarız. Nette'de bu çocuk oyuncağıdır.

Geçerli istek, storeRequest() metodu kullanılarak oturumda saklanabilir, bu metot isteğin tanımlayıcısını kısa bir dize olarak döndürür. Metot, geçerli presenter'ın adını, görünümünü ve parametrelerini saklar. Bir form da gönderildiyse, alanların içeriği de saklanır (yüklenen dosyalar hariç).

İsteğin geri yüklenmesi, elde edilen tanımlayıcıyı ilettiğimiz restoreRequest($key) metodu tarafından gerçekleştirilir. Bu metot, orijinal presenter'a ve görünüme yönlendirir. Ancak, saklanan istek bir form gönderimi içeriyorsa, orijinal presenter'a forward() metoduyla geçer, forma daha önce doldurulan değerleri iletir ve yeniden oluşturulmasını sağlar. Bu şekilde kullanıcı formu tekrar gönderme fırsatına sahip olur ve hiçbir veri kaybolmaz.

Önemli olan, restoreRequest() metodunun yeni oturum açan kullanıcının formu başlangıçta dolduranla aynı olup olmadığını kontrol etmesidir. Değilse, isteği atar ve hiçbir şey yapmaz.

Her şeyi bir örnekle gösterelim. Verilerin düzenlendiği ve startup() metodunda kullanıcının oturum açıp açmadığını doğruladığımız bir AdminPresenter'ımız olsun. Değilse, onu SignPresenter'a yönlendiririz. Aynı zamanda geçerli isteği saklarız ve anahtarını SignPresenter'a göndeririz.

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

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

SignPresenter, oturum açma formuna ek olarak, anahtarın yazılacağı kalıcı bir $backlink parametresi de içerecektir. Parametre kalıcı olduğu için, oturum açma formu gönderildikten sonra da aktarılacaktır.

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ı ekleyin ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

	public function signInFormSubmitted($form)
	{
		// ... burada kullanıcıyı oturum açtırın ...

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

restoreRequest() metoduna saklanan isteğin anahtarını iletiriz ve o, orijinal presenter'a yönlendirir (veya geçer).

Ancak anahtar geçersizse (örneğin, artık oturumda mevcut değilse), metot hiçbir şey yapmaz. Bu nedenle, AdminPresenter'a yönlendiren $this->redirect('Admin:') çağrısı takip eder.