Akce na při změně persistentního parametru

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

Moje téma vedle nějak bez reakce tak se pokusím to trošku zobecnit.

Je nějak možné zpracovat akci při změně persistentního parametru komponenty? Konkrétně mě jde o stránkovadlo. Když v komponentě vytvořím paginator co má persistentní parametr „page“ tak se krásně předává v url. Ale problém je jak aplikaci donutit aby na tento parametr provedla i nějakou akci? Jednoduše, kliknu na link stránkovadla a provede se změna stránky a zároveň mě to zpracuje nějaký „handle“

Je zde nějaká taková možnost?

enumag
Člen | 2118
+
0
-

Jasně, neměň ten parametr přímo, ale pomocí signálu.

Editoval enumag (18. 7. 2013 15:33)

akadlec
Člen | 1326
+
0
-

Takže tam kde mám generované linky stránkovadla je mám z této podoby:

<a href="{link this page => $paginator->page}">Next</a>

změnit na:

<a href="{link page! page => $paginator->page}">Next</a>
enumag
Člen | 2118
+
0
-

Bingo. :-)

akadlec
Člen | 1326
+
0
-

No tak takhle sem si to ošefoval předtím, jenže to generuje trochu hnusný tvar url, resp. moc dlouhy

http://adresa.aplikace.tld/akce?KOMPONENTA-paginator-page=2&do=KOMPONENTA-paginator-page
enumag
Člen | 2118
+
0
-

Jo, to je jedna z věcí které neumím vyřešit. Má někdo nějaký nápad co se s tou URL dá dělat?

xificurk
Člen | 121
+
0
-

Sice nevím jakou přesně chceš vyvolávat akci, ale pokud jde čistě o to invalidovat nějaký snippet při AJAXu, tak by řešením mohlo být generovat v linkách normální URL bez signálu a ten signál tam přidat jen při volání AJAXu.

akadlec
Člen | 1326
+
0
-

Jop, to je důvod proč to tak chci, invalidace snippetů. V textu mám prostě výpis dat které potřebuju odstránkovat ale musím invalidovat jen ten konkrétní snippet a né ty okolo.

Jen si tak nějak nedovedu představit jak detekovat že request bude ajaxem a přidat tam signál. Leda snad tak že by to tam bylo nahardkoděné což je zase něco čemu se chcu vyhnout.

Ono tam kde to mám použito je to ovládano ajaxem s pomocí nette.ajax.js ale potlačil jsem si tam history extension, takže se mě ta kliknutá url nepropaguje do příkazové řádky, takže takto dlouhou url uvidí jen někdo kdo ví kám na tvar url kouknout.

xificurk
Člen | 121
+
0
-

Nejpřímočařejší by bylo vygenerovat to „ošklivé“ URL se signálem do nějakého data atributu. A pak si rozšířit nette.ajax.js, aby se před odesláním requestu podívalo, jestli existuje tento atribut a použilo jeho obsah pro AJAX request.
Pokud je tohle řešení z nějakého důvodu nemožné, tak to budeš muset nahackovat nějak na míru přes rozšíření nette.ajax.js

peter.z
Člen | 37
+
0
-

Ak to mas v komponente (Control), tak potom preco neurobis nieco taketo?

public function attached($presenter)
{
	parent::attached($presenter);

	if ($presenter->isAjax()) {
		$this->invalidateControl('obsah');
	}
}

To ti invaliduje snippet obsah pri kazdom AJAX requeste. V render metode uz budes pracovat s premennymi paginatoru. Odkazovat budes na to zmenou page parametru.

Alebo sa mylim a nebude to tak fungovat vobec? :D

akadlec
Člen | 1326
+
0
-

@peter.z: To není ono, to by se mi ten snippet invalidoval při každém requestu což zase nechcu.

EDIT:
Beru zpět, pomocí attached to funguje ale jen pro následující stránky, když chci přejít na stránku 1 tak se to invaliduje špatně.

Editoval akadlec (18. 7. 2013 20:32)