FlashMessages v komponentě + AJAX

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

Zdravím,
řeším takový problém s vypisování FlashMessages pomocí AJAXu.
Vypisování řeším v komponentě a její šabloně (zprávy je potřeba seskupit dle typu). Tato komponenta je vložena do layoutu. Při AJAXovém požadavku (např. při odeslání formuláře) se ale komponenta vůbec nevytvoří (resp. nezavolá se metoda render), tudíž se ani FlashMessages nevykreslí a nepošle se snippet s nimi. Problém asi bude, že AJAXové volání nevede přímo do té komponenty, ale např. do presenteru, ve kterém se zpracovává formulář a kde se pošle FlashMessage.
redrawControl jsem zkoušel volat jak v presenteru (po zavolání flashMessage), tak i v té komponentě (v konstruktoru).
Bez použití AJAXu samozřejmě vše funguje.

Jak byste to řešili?

Díky za jakékoliv tipy.

Editoval vasam (18. 7. 2014 18:11)

mkoubik
Člen | 728
+
0
-

Musíš při přidání flash message tu komponentu nějak invalidovat. Pokud máš nějaký BaseControl tak třeba nějak takhle:

class BaseControl extends Control
{
	public function flashMessage($message, $type = 'info')
	{
		parent::flashMessage($message, $type);
		$this->getPresenter()->getComponent('flashMessages')->invalidateControl();
	}
}

Samozřejmě by se to asi dalo řešit elegantněji.

vasam
Člen | 26
+
0
-

Jj, takto mi to v podstatě taky funguje, ale trochu mi vadí, že bych všude musel cpát svého předka.

Nejde nějak udělat, aby se ta komponenta invalidovala „sama“ (např. v kostruktoru, který se vždy zavolá)?
Moje představa je taková, že v presenteru zavolám flashMessage, komponenta se invaliduje a překreslí.

Momentálně mi to funguje, pokud přímo v presenteru ještě po flashMessage zavolám

$this->getComponent('flashes')->redrawControl()

To mi ale nepřijde moc elegantní a chtěl bych to přesunout do komponenty.

hitzoR
Člen | 51
+
0
-

Nejsem sice v Nette nejzkušenější, ale co jsem tak pochopil, tak komponenty by měly být úplně samostatné bez nějakých vazeb na presentery. Musí ta akce, kterou voláš, být tak nutně v presenteru? Pokud si dělám nějakou komponentu, tak vždy jen když ji využiju na více místech a bylo by pro mě trochu zbytečné psát jeden a ten stejný kód do několika presenterů zároveň, když bych ho mohl nacpat přímo do té komponenty, čímž by ti odpadly i starosti ohledně flashMessage.

vasam
Člen | 26
+
0
-

Jj, to je jasné – za normálních okolností to tak taky dělám. Ale tohle je trošku něco jiného – ta komponenta nezpracovává přímo akci z presenteru. Jen zpracuje a vykreslí „nahromaděné“ flash zprávy, které se samozřejmě posílají z různých míst z presenteru (ale třeba i z jiných komponent).

vasam
Člen | 26
+
0
-

Vyřešil jsem to nakonec tak, že jsem dal redrawControl do BasePresenteru.