FlashMessages v komponentě + AJAX
- vasam
- Člen | 26
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
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
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
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
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).