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.