Automatické překreslení komponenty (ajax)
- Nifty
- Člen | 45
Zdravim, řešim problém s ajaxem v komponentě. Celá šablona komponenty je obalena ve snippetu. Pokud do komponenty předávám nějaké parametry, tak se komponenta překreslí a vše funguje v pořádku. Pokud ale žádné parametry do komponenty nepředávám, tak se komponenta nepřekreslí (je to logické, ale přesto to potřebuju). Bez ajaxu vše funguje v pořádku.
Mám klasickou továrničku na komponentu:
protected function createComponentMyComponent()
{
return new MyComponent;
}
A komponentu jednoduše vykresluji v šabloně presenteru:
{control myComponent}
Funkční řešení by bylo v dané akci presenteru vynutit překreslení komponenty:
public function actionDefault()
{
if($this->isAjax()){
$this['myComponent']->invalidateControl();
}
}
Takových komponent mám ale několik a nepřijde mi dobré psát to pořád dokola.
Další řešení by bylo mít v komponentě nějaký kontrolní persistentní parametr, ale to mi taky nepřijde jako zrovna dobré řešení.
Existuje nějaký lepší způsob, než výše uvedené?(nejlépe na straně komponenty) Díky za odezvu :)
- Vojtěch Dobeš
- Gold Partner | 1316
Úplně tomu nerozumím, cílem je, aby se komponenta překreslila úplně při každém requestu, i takovém, který s ní nesouvisí? Pak je skutečně řešením si ji takto ručně „vyžádat“ – zajistit její inicializaci.
- Vojtěch Dobeš
- Gold Partner | 1316
Nicméně určitě bych se zeptal, na co konkrétně to potřebuješ? Je možné, že dotaz vyplývá z požadavku, který lze řešit celkově mnohem elegantněji, právě protože tě nyní vede k takto otravnému kódu :)
- Nifty
- Člen | 45
Cílem je, aby se komponenta vykreslila při každém requestu v rámci akce
presenteru, kde se komponenta využívá.
Jedná se o vlastní grid (každý grid je třída, která dědí z hlavního
gridu), kde v inicializaci gridu předávám odkazy na signály presenteru
(publish, delete, ..). Kdyby signály byly v daném gridu, tak by to fungovalo
(parametr by byl ?do=myGrid-signal) ⇒ grid by měl parametr ⇒ signál by se
vykonal ⇒ grid by se překreslil automaticky. Jenže ty signály využívám
v rámci presenteru i mimo grid. A kdybych měl ty signály dvakrát(v gridu
i presenteru), tím bych porušil DRY. Pokud tedy odkazuju z gridu na signál
presenteru, tak se signál vykoná, ale grid už se nepřekreslí a to je ten
problém. Snad už je to trochu jasnější.
Editoval Nifty (29. 5. 2012 1:17)
- Vojtěch Dobeš
- Gold Partner | 1316
No, pokud ten signál na presenter mění něco v tom gridu, nebylo by lepší mít signál přímo na gridu? Druhak proč je potřeba odkaz v presenteru, mimo grid?
- Vojtěch Dobeš
- Gold Partner | 1316
Rozumím. Pokud ti to funguje, v pořádku :). Nicméně jako čistší mi přijde klidně vytvořit signál jako na gridu, tak na presenteru, a v odpovídajícím místě vždy volat ten nebo ten. K DRY podle mě stačí, když v obou bude hlavní logika zapouzdřena do jednotného volání třeba nějaké modelové služby nebo tak něco. V praxi se mi osvědčilo být u presenterové (potažmo controlové) vrstvy (tedy de facto vrstvě obalující volání modelu) velkorysejší, časem to přináší větší flexibilitu při změnách.
Samotná business logika by samozřejmě ani v jednom z těchto míst být neměla, jenom by z nich měla být volána.