Společná akce pro více komponent?

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

Mám takový problém, bude to asi otázka návrhu. Mám komponenty akční zboží, novinky, nejprodávanější, nabídka zboží v kategorii atd. atd.

Každá z komponent si šáhne do databáze aby si získala seznam zboží pro vypsání. Ale systém má velice složitý výpočet ceníků, který nelze kešovat a po získání zboží je potřeba položit složitý dotaz do databáze, aby se získalo více ceníků pro dané zboží a mezi nimi ještě probíhají různá porovnání, kde výsledkem je cena pro konkrétní produkt.

U špaget se to řešilo jednoduše, před samotným vypsáním zboží (spuštěním šablony) se při každém jednotlivém selectu plnil zásobník zboží a pak se hromadně naplnil příslušnými ceníky, tedy dotaz do dtb byl pouze jeden.

Co teď? Při widgetech? Máte návrh?

Jakub Šulák
Člen | 222
+
0
-

A co vytvořit rodiče těchto komponent, která bude implementovat tu funkci, kterou používáš pro ceníky a potom tyto komponenty udělat jako potomky? Nevím jestli jsem tě dobře pochopil…

mcmatak
Člen | 490
+
0
-

No ono jde spíš o to, že když voláš widget v šabloně tak teprve si to šáhne do databáze, nelze tedy dojít stavu, kdy znáš všechny produkty na stránce a nejdříve plníš data a pak teprve přistoupíš k vypisování šablon, protože nette je udělané tak, že ve chvíli kdy zobrazuješ šablonu teprve model šahá do dtb, ve špagetách si to klasicky připravíš dopředu.

Ondřej Brejla
Člen | 746
+
0
-

Taky si nejsem jistý, jestli jsem to správně pochopil…ale tobě jde o to, aby si komponenty mohl používat už v požadované action (případně jiné metodě) a aby se nevytvářely až při vykreslování v šabloně? To přeci můžeš, widget tě v tomto nijak neomezuje…to je pouze hezčí zápis volání render() na komponentě.

Ty si přeci v jakékoliv action (jakékoliv metodě) pro každou potřebnou komponentu můžeš sáhnout např. přes $zbozi = $this->getComponent('akcniZbozi'); (nebo jinak, to je jedno). To, že si pro ni sáhneš ještě přeci neznamená, že jí následně musíš v šablonách vykreslovat. Tam už si vykreslíš jen tu, kterou potřebuješ.

A pokud tu operaci potřebuješ provádět se všemi komponentami v daném presenteru při každé action, tak buď si ve startup() zavolej metodu, kde to obsloužíš, nebo to obsluž přímo ve startup() – případně beforeRender()?.

Ale je dost možné, že jsem tě vůbec nepochopil, tak to případně zkus lépe vysvětlit :-)

Editoval Warden (21. 10. 2009 11:03)

Honza Marek
Člen | 1664
+
0
-

což nějaké

public function renderHeader() {
	if (!$this->isInitialized()) {
		$this->initialize();
	}

	$template = $this->createTemplate()->setFile(dirname(__FILE__) . "/header.phtml");
	$template->data = $this->data;
	$template->render();
}

by to neřešilo?

mcmatak
Člen | 490
+
0
-

no asi si v podstatě rozumíme

mám komponenty akční zboží a nové zboží

v šabloně

{control newGoods}
{control actionGoods}

což je fajn, protože někdy to chci zobrazit a někdy nechci, tím si můžu řídit např. tabcontrol, tzn. když ten daný blok šablona má, načte si tu komponentu, jednoduše řečeno šablona mi dovoluje si určovat jaké komponenty a jaká data se budou načítat

jenomže newGoods a actionGoods obě potřebují volat jedná metodu, ale až po načtení dat!

kdybych si to připravil ve startup jak říkáš nemohl bych si řídit v šabloně kdy ty data potřebuji a kdy ne, ne vždy chceš zobrazit nové zboží, ale je to třeba závislé na přepínání záložek

ale je mi to jasné tohle prostě udělat nepůjde, v šabloně už je moc pozdě na to zajišťovat posloupnost akcí, které patří modelu

navíc jak někdo řekl není to OOP, ale zase chtěl sem šetřit výkon

Editoval mcmatak (21. 10. 2009 11:32)