K čemu slouží widget?

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

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

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

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

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)

redhead
Člen | 1313
+
0
-

Bernard Williams napsal(a):

Možná by nebylo na škodu, aspoň tohle „málo“, hodit Wiki.

No, něco sem tam sepsal.. Aspoň jsem napomohl k lepší dokumentaci Nette :D :D

crempa
Člen | 198
+
0
-

Ahoj,

muzu nejak pres widget definovat krome nazvu komponenty i parametr $name pouzivany v createComponentXyz($name) ?

Diky

Honza Marek
Člen | 1664
+
0
-

Parametrem $name se předává název komponenty.

crempa
Člen | 198
+
0
-

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

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

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..

despiq
Člen | 320
+
0
-

a ja myslel ze je toto vyresene, sice frameworkem nepodporovane ale
vyresene

crempa
Člen | 198
+
0
-

A to reseni je teda jake? Popravde sem se v tom vlakne celkem ztratil…

_Martin_
Generous Backer | 679
+
0
-

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

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

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 :)

despiq
Člen | 320
+
0
-

to urcite, ja jsem ale alespon rad za to ze to jde, bohuzel DG psal ze to neni navrzene pro vypis stejne komponenty nekolikrat a zatim ze o nejake implementaci ani neuvazuje, teda alespon takovy jsem ziskal z jeho prispevku pocit

jasir
Člen | 746
+
0
-
  1. Makro widget article:short a=>3, b=>4 jen zavolá $control->getControl($name)->renderShort(array(a=>3,b=>4))
  2. 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)

despiq
Člen | 320
+
0
-
<?php
        public function createComponent($name) {
                if (preg_match("/^article/",$name) {
                        return new Article($this, $name);
                }
                return parent::createComponent($name)
        }
?>

to taky pujde

Editoval despiq (24. 1. 2010 3:00)

David Grudl
Nette Core | 8228
+
0
-

Ale jo, o implementaci se uvažuje, ale nevím, kdy to bude.

zelenomodrypes
Člen | 11
+
0
-

Jaký je prosím vás rozdíl mezi zápisem {widget myForm} a {control myForm}?

redhead
Člen | 1313
+
0
-

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)

David Grudl
Nette Core | 8228
+
0
-

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í :-)

PetrP
Člen | 587
+
0
-

David Grudl napsal(a):

Nebo naopak… Kdo ví :-)

Bylo to naopak, comitl jsi widget, a někteří štouralové (já) si stěžovali že je to zavedení nového názvosloví, a tak si přidal i control.

Editoval PetrP (17. 2. 2010 13:42)

Vyki
Člen | 388
+
0
-

David Grudl napsal(a):

Ale jo, o implementaci se uvažuje, ale nevím, kdy to bude.

Nechci být otravnej, ale jak to vypadá s tou implementací. Teď se chystám na větší projekt tak jenom jestli s tím můžu třeba do měsíce počítat, nebo si to napsat provizorně?