Action do jiného presenteru

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

Zdravím,
potřeboval bych vytvořit formulář, který bude odkazovat do jiného presenteru.
Na hlavní stránce mám formulář pro filtrování kurzů, který by měl směřovat do presenteru Courses, který pak vrátí jen stránku s daty pro daná kritéria (jazyk, úroveň znalostí).

Je možné nějakým parametrem nastavit action formuláře přímo do presenteru? Našel jsem si na webu action na jiný PHP soubor, ale příjde mi blbost tam psát napevno adresu, když se pak může změnit routa.

Díky moc!

Editoval Northys (1. 9. 2013 21:48)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

V továrničce v presenteru:

$form->setAction($this->link('Presenter:action'));
duke
Člen | 650
+
0
-

Běžné je po zpracování formuláře přesměrovat (už proto, abys zabránil nechtěnému vícenásobnému odeslání formuláře) a přesměrovat přeci můžeš po zpracování dat z původního presenteru do libovolného jiného. Z jakého důvodu chceš přesouvat zpracovávání formuláře jinam, když bys měl stejně poté přesměrovat? V čem vidíš výhodu?

Northys
Člen | 29
+
0
-

Díky moc za rychlou odpověď @mojtech.dobes

@duke kam si mám uložit data, které potom budu potřebovat jinde? session? hmm… není náhodou v nette pro každý presenter extra „složka“ pro session data?

EDIT: ať si to pošlou klidně 100x… nic se stejně nemůže stát, je to jen na filtrování dat, která se vypíšou. žádné přihlášení, edity atp.

Editoval Northys (1. 9. 2013 22:14)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nope, není. Ale duke podotknul dobrou věc… může to být cesta k lepšímu návrhu. Ale to by se dalo usuzovat až po spatření více kódu (aspoň pro mě to tak platí :) ).

Northys
Člen | 29
+
0
-

vojtech.dobes napsal(a):

Nope, není. Ale duke podotknul dobrou věc… může to být cesta k lepšímu návrhu. Ale to by se dalo usuzovat až po spatření více kódu (aspoň pro mě to tak platí :) ).

jak jsem napsal do editu – je to jen pro SQL where, nic se nezapisuje, pouze selektuje, takže nevidím důvod, proč to neudělat takhle…

EDIT: http://mediterin.cz/www/ viz tabulka vyhledávání kurzů, ještě je tam formulář na pevno – bude pak odkazovat do http://mediterin.cz/www/kurzy kde se pak vypíšou jen určité jazyky.

Editoval Northys (1. 9. 2013 22:16)

duke
Člen | 650
+
0
-

Northys napsal:

@duke kam si mám uložit data, které potom budu potřebovat jinde? session?

Pokud ta filtrovací data nejsou příliš obsáhlá, tak si je prostě předej v parametrech příslušné akce presenteru (tj. přes url). Tzn. něco jako:

	$this->redirect('CoursesPresenter:list', array(
		'language' => $language,
		'level' => $level,
		'lector' => $lector
	));

Pokud jsou data obsáhlejší, můžeš si je uložit přes náhodně vygenerovaný klíč např. do session a přes parametr si poslat jen onen klíč, podle kterého to v té session najdeš. Kdybys použil konstantní umístění v session, mohlo by docházet ke konfliktům (např. dvě okna ve stejném prohlížeči s různým filtrováním, atp.). V případě, že by ses rozhodl použít session, chtělo by to pak ještě vyřešit i expiraci těch klíčů, aby se tam příliš nehromadily.

Northys napsal:

hmm… není náhodou v nette pro každý presenter extra „složka“ pro session data?

Z kódu metody Presenter::getSession je zřejmé, že sekci (ty tomu říkáš „složka“) session je třeba specifikovat parametrem, jinak dostaneš přímo službu Session (a nikoli sekci). Tj. např.:

	$coursesSession = $this->getSession('coursesFilters');
	$coursesFilters = $coursesSession[$filterKey]; // $filterKey je parametrem akce presenteru
Northys
Člen | 29
+
0
-

@duke použil jsem první možnost. původní „řešení“ se setAction nefungovalo a formulář pořád mířil na HomepagePresenter, nevím proč :) tvoje řešení je ale elegantnější a přehlednější – nestane se, že budu hledat kde je zpracování formuláře :)

díky vám všem, můžete lock