Nette Documentation Preview

syntax
Kako se vrniti na prejšnjo stran?
*********************************

.[perex]
Kaj če uporabnik izpolni obrazec in mu poteče prijava? Da ne bi izgubili podatkov, jih pred preusmeritvijo na prijavno stran shranimo v sejo. V sistemu Nette je to zelo enostavno.

Trenutni zahtevek lahko shranimo v sejo z metodo `storeRequest()`, ki vrne njegov identifikator kot kratek niz. Metoda shrani ime trenutnega predstavnika, pogled in njegove parametre.
Če je bil poslan tudi obrazec, se shranijo tudi vrednosti polj (razen naloženih datotek).

Zahtevo obnovi metoda `restoreRequest($key)`, ki ji posredujemo pridobljeni identifikator. Ta preusmeri na prvotnega predstavnika in pogled. Če pa shranjena zahteva vsebuje oddajo obrazca, se z metodo `forward()` posreduje prvotnemu predstavniku , obrazcu se posredujejo predhodno izpolnjene vrednosti in omogoči ponovni izris. To uporabniku omogoča, da ponovno odda obrazec, pri čemer se podatki ne izgubijo.

Pomembno je, da `restoreRequest()` preveri, ali je novo prijavljeni uporabnik isti, ki je prvotno izpolnil obrazec. Če ni tako, zavrže zahtevo in ne stori ničesar.

Vse skupaj prikažimo s primerom. Imejmo predstavnik `AdminPresenter`, v katerem se urejajo podatki in katerega metoda `startup()` preverja, ali je uporabnik prijavljen. Če ni, ga preusmerimo na `SignPresenter`. Hkrati shranimo trenutno zahtevo in njen ključ pošljemo na `SignPresenter`.

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

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

Predstavnik `SignPresenter` bo poleg obrazca za prijavo vseboval tudi trajni parameter `$backlink`, v katerega se zapiše ključ. Ker je parameter obstojen, se bo prenesel tudi po oddaji obrazca za prijavo.


```php
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;
		// ... dodajanje polj obrazca ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

	public function signInFormSubmitted($form)
	{
		// ... tukaj se uporabnik vpiše ...

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

Ključ shranjene zahteve posredujemo metodi `restoreRequest()` in ta nas preusmeri (ali posreduje) na prvotni predstavnik.

Če pa je ključ neveljaven (na primer ne obstaja več v seji), metoda ne stori ničesar. Zato je naslednji klic `$this->redirect('Admin:')`, ki preusmeri na `AdminPresenter`.

{{priority: -1}}
{{sitename: Best Practices}}

Kako se vrniti na prejšnjo stran?

Kaj če uporabnik izpolni obrazec in mu poteče prijava? Da ne bi izgubili podatkov, jih pred preusmeritvijo na prijavno stran shranimo v sejo. V sistemu Nette je to zelo enostavno.

Trenutni zahtevek lahko shranimo v sejo z metodo storeRequest(), ki vrne njegov identifikator kot kratek niz. Metoda shrani ime trenutnega predstavnika, pogled in njegove parametre. Če je bil poslan tudi obrazec, se shranijo tudi vrednosti polj (razen naloženih datotek).

Zahtevo obnovi metoda restoreRequest($key), ki ji posredujemo pridobljeni identifikator. Ta preusmeri na prvotnega predstavnika in pogled. Če pa shranjena zahteva vsebuje oddajo obrazca, se z metodo forward() posreduje prvotnemu predstavniku , obrazcu se posredujejo predhodno izpolnjene vrednosti in omogoči ponovni izris. To uporabniku omogoča, da ponovno odda obrazec, pri čemer se podatki ne izgubijo.

Pomembno je, da restoreRequest() preveri, ali je novo prijavljeni uporabnik isti, ki je prvotno izpolnil obrazec. Če ni tako, zavrže zahtevo in ne stori ničesar.

Vse skupaj prikažimo s primerom. Imejmo predstavnik AdminPresenter, v katerem se urejajo podatki in katerega metoda startup() preverja, ali je uporabnik prijavljen. Če ni, ga preusmerimo na SignPresenter. Hkrati shranimo trenutno zahtevo in njen ključ pošljemo na SignPresenter.

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

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

Predstavnik SignPresenter bo poleg obrazca za prijavo vseboval tudi trajni parameter $backlink, v katerega se zapiše ključ. Ker je parameter obstojen, se bo prenesel tudi po oddaji obrazca za prijavo.

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;
		// ... dodajanje polj obrazca ...
		$form->onSuccess[] = [$this, 'signInFormSubmitted'];
		return $form;
	}

	public function signInFormSubmitted($form)
	{
		// ... tukaj se uporabnik vpiše ...

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

Ključ shranjene zahteve posredujemo metodi restoreRequest() in ta nas preusmeri (ali posreduje) na prvotni predstavnik.

Če pa je ključ neveljaven (na primer ne obstaja več v seji), metoda ne stori ničesar. Zato je naslednji klic $this->redirect('Admin:'), ki preusmeri na AdminPresenter.