Společná akce pro více komponent?
- mcmatak
- Člen | 504
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
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 | 504
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
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
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 | 504
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)