K čemu slouží widget?
- Bernard Williams
- Člen | 207
Nazdárek,
asi se Vám to bude zdát jako směšná otázka, ale k čemu přesně
slouží widget
v šabloně? Snad ve všech příkladech se to
používá, ale nikde se mi
nepodařilo najít, k čemu přesně je a jaké má výhody oproti
{!$form}
. Mohl by mi to někdo shrnout nebo mě případně
odkázat na nějaké stránky, kde to bude podrobně popsané?
Děkuji
Bernard
- redhead
- Člen | 1313
u tvého příkladu s formem musíš šabloně předávat formulář do proměnné $form. S widgetem a použitím továrniček nemusíš, widget si ho sám z presenteru/componenty vytáhne a zavolá metodu render. A teď pozor je tu ještě jedna hezká věc. Můžeme volat i jiné render metody:
{control mojeKomponenta} zavolá metodu render() nad komponentou
{control mojeKomponenta:metoda1} zavolá metodu renderMetoda1() nad komponentou
{control mojeKomponenta:metoda2 $id, "bla"} zavolá metodu renderMetoda2($id, "bla") nad komponentou
- redhead
- Člen | 1313
dám příklad s košíkem pro nějaký Eshop. Mějme komponentu ‚cart‘ definovanou v nějaké továrničce v BasePresenteru. V šabloně pak můžeme použít
{control cart:small} vytvoří malý košík, vhodný třeba někam do sidebaru
{control cart:big} vytvoří velký košík, vhodný pro samostatnou stránku s košíkem
určitě lepší než volat
{!$cart->renderSmall()}
a ještě nutnost naplňovat proměnnou $cart komponentou. S widgetem je to hezky lazy.
- Bernard Williams
- Člen | 207
Super! Mockrát děkuji. Samým nadšením z funkčnosti a z ulehčení práce jsem Ti zapomněl poděkovat, takže ještě jednou moc děkuji za objasnění a za příklady. Možná by nebylo na škodu, aspoň tohle „málo“, hodit Wiki.
Editoval Bernard Williams (24. 1. 2010 22:42)
- crempa
- Člen | 198
Aha, takze asi plavu v nazvoslovi, zeptam se teda jinak.
Kdyz vytvarim novou instanci konkretni komponenty tak dle klasickeho zpusobu sem
specifikoval predka a nazev komponenty, diky tomu sem pak mohl mit vice instanci
teze komponenty na jedne strance (nazev oddelil napr. signaly atd.)
Jak stejneho vysledku dosahnu pomoci widgetu kde specifikuju obecne jakou komponentu chci vykreslit? Na vsechny komponenty chci vyuzit tutez createComp. metodu a jedine co me je odlisi je tedy jejich jmeno (rekneme, ze to jak se komponenta zpracuje je uz dano interne na zakladu jejiho jmena)
priklad: chci mit na strance vic datagridu s oddelenym filtrovanim, strankovanim atd. a ty vytvorit v tovarnice pod jednou metodou, normalne bych je oddelil pomoci $name ⇒ jak ho ale pouzit u widgetu ?
Diky !
- redhead
- Člen | 1313
Ono právě ty továrničky mají vytvářet jen jednu instanci.. Také by se mi líbila možnost udělat createComponentXyz jako nějaký contructor a při změně jména vracet jiné instance stejné komponenty. Krásně by se tím řešilo více formulářů na stránce (alá ‚přidat do konšíku‘ u seznamu výrobků) nebo co jsem třeba dělal já – RatingControl u seznamu článků.
Celkem by mě zajímalo co na to David, možný mě něčím odstřelí..
- crempa
- Člen | 198
Diky,
Ahaa ono je to jen na jednu instanci… v tom pripade nechapu tu hromadu superlativ vsude kolem tovarnicek, vzdyt je s tim snad jeste vic psani nez s klasikou driv.. :-)
ja mel za to ze udelam neco jako {control myTable(tabulecka1)}
a
pak {control myTable(tabulecka2)}
a budu mit pres jednu tovarnicku
dve instance myTable (kazda s jinym jmenem). MyTable by si pak uz treba lazy
loadingem osefoval nacteni konkretnich parametru tech tabulek dle jmena..
- _Martin_
- Generous Backer | 679
despiq napsal(a):
a ja myslel ze je toto vyresene, sice frameworkem nepodporovane ale
vyresene
Ono jsme s mcmatakem přišli na nějaké řešení, ale nějak jsem se
zatím nedostal k tomu to sepsat… =[ Pro více instancí je potřeba použít
kombinaci metod createComponentTrida
a obecné
createComponent
. Pokud se ti podaří stáhnout příklad, který
jsem uvedl tady,
tak by ti to mohlo pomoci.
- crempa
- Člen | 198
No tak zatim jsem to vyresil vlastnim makrem
{myTable $presenter,'oznaceni_instance'}
nevim zda neprichazim o nejakou vyhodu kdyz to nedelam pres widget, ale v handleru toho makra je primitivni tovarnicka a funguje to krasne – je s tim minimum psani, jedina nevyhoda ze musim predavat i ten presenter..
- crempa
- Člen | 198
Tak se jeste doplnim, vlastni makro je znacne nedokonale reseni, protoze makra se zpracovavaji az po fazi handle signalu a tudiz komponenta nesmi pouzivat signaly…
Jedinou moznosti je opravdu pretizit createComponent()
ktera
poskytuje jakes takes reseni (ne na globalni urovni, ale v ramci projektu
akceptovatelne)
Kazdopadne by nejake {control Komponenta.nazevInstance}
s
createComponent<Komponenta>($nazevInstance)
bodlo :)
- jasir
- Člen | 746
- Makro
widget article:short a=>3, b=>4
jen zavolá$control->getControl($name)->renderShort(array(a=>3,b=>4))
- Jestli tedy správně chápu, čeho chceš dosáhnout, stačí v presenteru přepsat createComponent:
<?php
public function createComponent($name) {
if (preg_match("#^article\d+#",$name) {
$control = new Article;
$this[$name] = $control;
return $control;
}
return parent::createComponent($name)
}
?>
Pak můžes psát {widget article1}
Editoval jasir (24. 1. 2010 3:10)
- David Grudl
- Nette Core | 8228
redhead napsal(a):
naprosto žádný, je to alias, ale spíše se používá widget (kdysi tu byla o tom debata, a control asi zůstal pro zpětnou kompatibilitu)
Nebo naopak… Kdo ví :-)