Jak zjistit změnu persistentního parametru?

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

Potřeboval bych zjistovat jestli nedošlo ke změně persistentního parametru a provést nějákou akci.
Řekněme že mám persistentní parametr $lang aktuálně v ní mám nastaveno ‚cs‘ a změním ji na ‚en‘. Ale při této změně chci provést ověření jestli je jazyk ‚en‘ dostupný. (Ano vím že můžu v routách nastavit povolené parametry ale tohle je vzorový příklad někde to třeba nejde kvuli tomu že by jich tam bylo hodně).
Chtěl jsem to udělat takto:

<?php
class DefaultPresenter extend BasePresenter
{
	/** @persistent */;
	public $lang;

	protected function startup()
	{
		if ($this->lang != $this->getParam('lang'))
			overExistenciJazyka($lang);
	}
}
?>

Ale je tu problém protože už ve startup-u mám v proměné $this->lang nové hodnoty. Jak tedy na to? Nechce se mě to řešit přez cookie

Editoval vrtak-cz (2. 5. 2009 19:27)

Ola
Člen | 385
+
0
-

Tohle se bez session (/cookie) nebo dalšího parametru v url IMHO neobejde..

pmg
Člen | 372
+
0
-
/** @persistent */
public $lang;

/** @persistent */
public $oldLang;

public function loadState(array $params)
{
	$lang = &$params['lang'];
	$old = &$params['oldLang'];

	if (isset($lang) && $lang !== $old) {
		if (isOkay($lang)) {
			$params['oldLang'] = $lang;
		else {
			unset($params['lang'], $params['oldLang']);
		}
	}

	parent::loadState($params);
}
pmg
Člen | 372
+
0
-

Ale řešení přes session se mi zdá správné. Ten parametr oldLang by tam dost prudil.

Dále by se nabízelo udělat ze změny jazyka signál. Jazyk je lepší přenášet v URL.

/** @persistent */
public $lang;

public function loadState(array $params)
{
	if (isset($params['lang'])) {
		$session = Environment::getSession('display');
		if ($session->lang !== $params['lang']) {
			if (isOkay($params['lang']) {
				$session->lang = $params['lang'];
			} else {
				$params['lang'] = $session->lang;
			}
		}
	}

	parent::loadState($params);
}

Editoval pmg (11. 4. 2009 9:32)

Ola
Člen | 385
+
0
-

Jo, ta url by s oldLang vypadala divně, navíc by do toho mohl návštěvník sahat, takže by se mohl vyhnout kontrole existence jazyka .. Ale zase jazyk (teda parametr lang) je lepší přenášet v URL, protože kdyby byl uložen v session, dělalo by to border ve vyhledávačích ..

Editoval Ola (11. 4. 2009 10:16)

pmg
Člen | 372
+
0
-

Myslím, že máš recht.

phx
Člen | 651
+
0
-

Nejak mi neni jasne PROC chces detekovat zmenu? To je overeni existence jazyka tak narocna vec ze se nemuze delat pokazde???

Jinak asi nejlepsi reseni overovani vuci hodnote v SESSION.

Patrik Votoček
Člen | 2221
+
0
-

phx napsal(a):

Nejak mi neni jasne PROC chces detekovat zmenu?

Někdy se to může hodit

phx napsal(a):

To je overeni existence jazyka tak narocna vec ze se nemuze delat pokazde???

Nikde sem neříkal že to musí bejt ověřování jazyka. Jazyk je tady uveden jako příklad.

phx napsal(a):

Jinak asi nejlepsi reseni overovani vuci hodnote v SESSION.

Oni se perzistentni parametry přenášejí v SESSION? V jaké struktůře?

nAS
Člen | 277
+
0
-

vrtak-cz napsal(a):
Oni se perzistentni parametry přenášejí v SESSION? V jaké struktůře?

Perzistentní parametry se ukládají v URL. phx to myslel tak, že si hodnotu uložíš ještě jednou redundantně do SESSION, kde ji uživatel nemůže změnit a když se nebude shodovat hodnota perzistentního parametru a hodnota v SESSION, tak došlo ke změně.

Ale popravdě řečeno si také moc nedokážu představit příklad, kde by se to hodilo. Pokud chci, aby uživatel něco nemohl přímo měnit, tak to uložím v SESSION a dám mu nějaké metody, jak to může změnit kontrolovaně v aplikaci. A pokud mi nevadí, že to změní, tak to patří do URL (tedy např. do perzistentní parametrů).