Automatické překreslení komponenty (ajax)

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

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
+
0
-

Ú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
+
0
-

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
+
0
-

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
+
0
-

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?

Nifty
Člen | 45
+
0
-

No právě že ty signály využívám v gridu i v presenteru. V presenteru při detailu konkrétního záznamu, apod.

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

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.

Nifty
Člen | 45
+
0
-

Ještě si to promyslim, ale nakonec to asi tak udělám. Díky za popostrčení :)