Nepřenášet persistentní parametry

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

Jak říct makru n:href, aby nepřenášelo persistentní parametry?

Používám persistentní parametry na filtrování výpisu a chtěl bych někde mít odkaz na sebe sama, který hodnoty persistentních parametrů vyresetuje.

Děkuji.

vvoody
Člen | 910
+
0
-

Treba ich nastavit na NULL.

	/** @persistent */
	public $id;
	<a n:href="Homepage:default id => null">test</a>

Editoval vvoody (1. 8. 2012 12:25)

Michal III
Člen | 83
+
0
-

Tomu jsem se právě chtěl vyhnout. Jednak těch parametrů je více, takže by se ten odkaz zbytečně protáhnul, a druhak ty defaultní hodnoty těch parametrů nejsou vždy null (ale třeba i true, nebo nějaké číselné hodnoty).

Znamenalo by to vlastně, že bych musel na dvou různých místech nastavit defaultní hodnoty oněch persistentních parametrů, což, myslím si, je proti principům nette psát co nejméně kódu – nic nepsat dvakrát.

V momentě, kdy bych chtěl defaultní hodnoty změnit, nemusel bych si uvědomit, že to musím změnit i na tom druhém místě a vedlo by to k vytváření chyb, kterých se chci vyhnout.

Chtěl bych programovat čistě a tohle se mi zkrátka zdá jako prasárna.

vvoody
Člen | 910
+
0
-

Ale ked nastavis parameter na NULL to znamena defaultna hodnota z routera. Uvediem priklad zase s perzistentnym „id“-ckom:

//v presenteri budeme kontrolovat parametre
dump($this->getParameter());
// idcku nastavim defaultnu hodnotu
$container->router[] = new Route('<presenter>/<action>[/<id>]', array(
	'presenter'=>'Homepage',
	'action'=>'default',
	'id'=>1
));
<a n:href="Homepage:default">test</a>
<a n:href="Homepage:default id => 2">test id 2</a>
<a n:href="Homepage:default id => null">test id null</a>

Na linku Homepage:default dostaneme:

array(2) {
   action => "default" (7)
   id => 1
}

Kliknem na link Homepage:default id ⇒ 2

array(2) {
   action => "default" (7)
   id => 2
}

A teraz ked kliknem na link Homepage:default id ⇒ null tak parameter id ma svoju defaultnu hodnotu, cize vygenerovany link je ten isty ako Homepage:default a parametre su znova

array(2) {
   action => "default" (7)
   id => 1
}

Cize NULL je defaultna hodnota.

A teraz ako riesit aby si nemusel vypisovat vsetky parametre v linku. Daj mi minutku, nieco skusam :) co povies keby to vo vysledku bolo nejako takto?

<a href={$presenter->defaultLink('Homepage:default')}>test</a>
Michal III
Člen | 83
+
0
-

Děkuji mnohokrát za vyčerpávající odpověď :-). Myslím, že takto by to bylo úplně v pořádku.

<a href={$presenter->defaultLink('Homepage:default')}>test</a>
vvoody
Člen | 910
+
0
-

Takze do BasePresenteru

public function defaultLink($destination){
	$parameters = $this->getParameter();
	unset($parameters['action']);
	foreach($parameters as $key => $value){
		$parameters[$key]=NULL;
	}
	return $this->link($destination,$parameters);
}

Urcite by sa dalo vytvorit aj makro.

Tomáš Votruba
Moderator | 1114
+
0
-

Ještě jeden tip na helper.

josef.sabl
Člen | 153
+
0
-

Mírně vylepšená verze:

	public function defaultLink($destination, $parameters)
	{
		$originalParameters = $this->getParameter();
		unset($originalParameters['action']);
		foreach ($originalParameters as $key => $value)
		{
			$originalParameters[$key] = NULL;
		}
		return $this->link($destination, $originalParameters + $parameters);
	}
Filip Procházka
Moderator | 4668
+
0
-

Takové složité věci většinou nejsou potřeba a stačí obyčejné

$this->link('this', array_fill_keys($this->getPersistentParams(), NULL));
mildabre
Člen | 62
+
0
-

josef.sabl napsal(a):

Mírně vylepšená verze:

	public function defaultLink($destination, $parameters)
	{
		$originalParameters = $this->getParameter();
		unset($originalParameters['action']);
		foreach ($originalParameters as $key => $value)
		{
			$originalParameters[$key] = NULL;
		}
		return $this->link($destination, $originalParameters + $parameters);
	}

Jenom bych opravil aby to bylo dle zadání

$originalParameters = $this->getParameter();

takto:

$originalParameters = $this->getPersistentParams();

Poznámka: Trochu mě mátlo, že $this->getParameter() vrací pole parametrů i když by dle názvu měl vracet parametr jeden.

mildabre
Člen | 62
+
0
-

Ještě jsem se zamyslel „co chtěl básník říci“ tím vynulováním persistentních parametrů. Pokud by se jednalo o jednorázové vypnutí filtrů typu /presenter/akce/1?order=byname&filter=orderValid&… tak v případě zapnutí či vypnutí filtru se jedná z pohledu analýzy de facto o drobné subrequesty které nemění šablonu daného action. Kdybychom na to pohlédli takto tak by se mě více líbilo definovat na vypnutí persistentních parametrů (filtrů) nějaký handler pro odpovídající signál.

Zadání úlohy se mě prostě nezdá analyticky dotažené – jak vím, že v budoucnu nepřibyde k persistentním parametrům nějaký který se filtrů netýká (třeba jazyk nebo šablona výpisu) a budu chtít vypnout jenom některé persistentní parametry?

V linku by se jednoduše uvedl signál clearListFilters a v odpovídajícím handleru by se vynulovaly parametry podle potřeby.

Jak se na to dívají ostatní ?

Michal III
Člen | 83
+
0
-

Inu proto jsem hledal způsob, jakým vytvořit odkaz bez explicitního nastavení persistentních parametrů. Persistentní parametry by se pak nastavily dle defaultních hodnot (což nemusí nutně být null). Myšlenka, že některé persistentní parametry možná bude třeba přenášet vždy, mě
nenapadla a je zřejmě správná, což znamená, že nevím, jak jednoduše tento „problém“ řešit.

Původně celá tato otázka vznikla, když jsem chtěl v podstatě nasimulovat první vstoupení do příslušného presenteru, ačkoli už jsem v daném presenteru byl.

Děkuji všem za jejich odpovědi.