(ne)přenášení persistentního parametru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pave.kucera
Člen | 122
+
0
-

Zdravím, mám v presenteru deklarovanou persistentní proměnnou a podminečně jí ve startupu přiřazuju hodnotu, ale po přiřazení a refreshi proměnná zmizí. Pro lepší představu kus kódu

<?php
abstract class BasePresenter extends Presenter {
	public $backlink;

	protected function startup() {
		parent::startup();

		if($this->getUser()->getSignOutReason() == User::INACTIVITY) {
			$this->backlink = $this->getApplication()->storeRequest();
		}
	}

	public static function getPersistentParams() {
		return array('backlink');
	}
}
?>

Je to feature, dělám něco špatně, anebo je chyba v Nette (0.9.4 stable)? Díky za jakoukoli radu :)

redhead
Člen | 1313
+
0
-

Persistence znamená, že se parametr přenáší mezi requesty (v URL), čili pokud chceš něco zachovat, musíš to udělat přes odkaz, aby se parametr v URL dokázal vygenerovat. Když dáš pouhý refresh na stránce, na kterou si právě přišel, tak ta persistence se samozřejmě ani nevygeneruje. Aspoň tedy doufám, že to tak je.. :)

Pokud jsem to tedy pochopil správně, tak přijdeš na stránku a podmínka je platná, vloží se tedy do $this->backlink klíč pro ten request po storeRequest. Když dáš pouhý refresh a ta podmínka už platná není v $this->backlink už nic být nemůže – žádný parametr s klíčem requestu totiž nebyl odeslán. Pokud bys kliknul na nějaký vygenerovaný odkaz, fungovat to bude. Pokud to chceš mít i při refreshi je nutné to asi vkládat do session a kontrolovat to ručně.

pave.kucera
Člen | 122
+
0
-

To mě mělo asi napadnout :)… Zkusil jsem přidat redirect, aby se perzistence vygenerovala (měla by, ne?), ale po refreshi stále nic…

<?php
protected function startup() {
	parent::startup();

        if($this->getUser()->getSignOutReason() == User::INACTIVITY) {
        	$this->backlink = $this->getApplication()->storeRequest();
		$this->redirect('this');
	}
}
?>

Edit: Vyzkoušel jsem i redirect způsobem

<?php
$this->redirect('this', array('backlink' => $this->getApplication()->storeRequest())), ale taky nic.
?>

Editoval JannBaill (18. 4. 2010 12:20)

redhead
Člen | 1313
+
0
-

Vyzkoušel jsem to a mě to jde. Použil jsem ale jinou podmínku, takže si zkontroluj, zda-li se ta podmínka opravdu vykoná, tj. jestli je uživatel opravdu odhlášen z důvodu nečinnosti. Mě stačilo pouze $this->redirect(‚this‘) bez specifikace parametru a po redirectu jsem v URL měl správně persistentní paramatr.. Řekl bych, že uživatel je odhlášen, ale z jiného důvodu. V příklad CD collection se při User::INACTIVE pouze uloží flashmessage se zprávou pro uživatele, ale backlink a redirect se vykoná i v případě nepřihlášeného uživatele, ať už z jakéhokoliv důvodu:

	$user = Environment::getUser();
	if (!$user->isAuthenticated()) {
		if ($user->getSignOutReason() === User::INACTIVITY) {
			$this->flashMessage('You have been logged out due to inactivity. Please login again.');
		}
		$backlink = $this->getApplication()->storeRequest();
		$this->redirect('Auth:login', array('backlink' => $backlink));
	}

Editoval redhead (18. 4. 2010 13:06)

pave.kucera
Člen | 122
+
0
-

Podmínka se vykoná správně určitě – dal jsem si na její začátek die(‚text‘); a aplikace na tom místě umře, když má (tzn uživatel je odhlášen po uplynutí limitu nastaveného při přihlášení). Příklad z CD collection funguje, ale pro mě je nepoužitelný – celá aplikace má být přístupná nepřihlášeným i přihlášeným, přičemž přihlášení mají právo zapisovat (přihlašovací formulář je na každé stránce)

redhead
Člen | 1313
+
0
-

No tak jediný rozdíl ještě vidím v tom, že při deklaraci té proměnné $backlink se v CD collections přiřazuje i defaultní hodnota (prázdný řetězec '') tak to zkus, jinak už nevím, nebo ještě zkus udělat persitenci přes anotaci, ale nevím proč by to nemělo chodit, tak jak to máš:

/** @persistent */
public $backlink = '';

Jinak co se týká vůbec té tvé logiky stránek. Když přece budou obě skupiny (přihlášený i nepřihlášený) moct být na všech stránkách bez omezení (kromě toho zápisu), tak není nutno používat ani storeRequest, ne? Stejně redirectuješ na stejnou stránku, takže backlink nemá ani moc smysl nebo ho nevidím..

pave.kucera
Člen | 122
+
0
-

Vyzkoušeno a stále nefunkční :(… Ten (re)storeRequest je tam pro případ, kdy uživatel píše déle než je doba, po které je automaticky odhlášen, tak ať se data neztratí a on nemusí všechno psát znovu.

pave.kucera
Člen | 122
+
0
-

Tak jsem to nakonec vyřešil přes session, ale proč nefunguje ten persistentní parametr mě stejně zajímá.