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

Bir kullanıcı bir form doldurursa ve oturum açma süresi dolarsa ne olur? Veri kaybını önlemek için, oturum açma sayfasına yönlendirmeden önce verileri oturuma kaydederiz. Nette'de bu çocuk oyuncağıdır.

Geçerli istek, tanımlayıcısını kısa bir dize olarak döndüren storeRequest() yöntemi kullanılarak oturumda saklanabilir. Yöntem geçerli sunucunun adını, görünümü ve parametrelerini saklar. Bir form da gönderilmişse, alanların değerleri de (yüklenen dosyalar hariç) kaydedilir.

İstek, alınan tanımlayıcıyı ilettiğimiz restoreRequest($key) yöntemi tarafından geri yüklenir. Bu, orijinal sunum yapan kişiye ve görünüme yönlendirir. Bununla birlikte, kaydedilen istek bir form gönderimi içeriyorsa, forward() yöntemini kullanarak orijinal sunucuya iletir, önceden doldurulmuş değerleri forma geçirir ve yeniden çizilmesine izin verir. Bu, kullanıcının formu yeniden göndermesine olanak tanır ve hiçbir veri kaybolmaz.

Daha da önemlisi, restoreRequest() yeni giriş yapan kullanıcının formu ilk dolduran kişiyle aynı olup olmadığını kontrol eder. Değilse, isteği atar ve hiçbir şey yapmaz.

Her şeyi bir örnekle gösterelim. Verilerin düzenlendiği ve startup() metodu kullanıcının giriş yapıp yapmadığını kontrol eden bir AdminPresenter sunumcumuz olsun. Eğer değilse, onu SignPresenter adresine yönlendiriyoruz. Aynı zamanda, mevcut isteği kaydediyoruz ve anahtarını SignPresenter adresine gönderiyoruz.

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

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

SignPresenter sunucusu, oturum açma formuna ek olarak anahtarın yazıldığı kalıcı bir $backlink parametresi içerecektir. Parametre kalıcı olduğundan, oturum açma formu gönderildikten sonra bile taşınacaktı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ı ekliyoruz ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

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

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

Kaydedilen isteğin anahtarını restoreRequest() yöntemine iletiriz ve bu yöntem orijinal sunucuya yönlendirir (veya iletir).

Ancak, anahtar geçersizse (örneğin, oturumda artık mevcut değilse), yöntem hiçbir şey yapmaz. Dolayısıyla bir sonraki çağrı $this->redirect('Admin:') olup AdminPresenter adresine yönlendirir.