Ö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.