Predani vstupni promenne komponente

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

Prosim o navrh jak to udelat v Nette rozumne.
Mam komponentu, ktere potrebuji predat nejaka data, ta je potom zpracovava a vytvari graficky vystup.
Je rozumne reseni – prijde mi nelogicke to predavat pres sablonu:

  1. v presenteru pripravit sadu dat
  2. v sablone nejak predat data: {control nazev $vstup} – jde to?
  3. v presenteru udelat neco jako

public function createComponentNazev($vstup)
{
zpracovani vstupu;
return $vystup;
}

Nebo jak elegantneji tam ta data dostat?

Ascaria
Člen | 187
+
0
-

Jednoduše celý postup hoď do presenteru do metody createComponentNazev a šablonu neřeš… Metoda createComponentNazev se pak provede v momentě, kdy je poprvé (tzn. většinou v šabloně) zavolaná (z pohledu presenteru tedy většinou až po metodě render<View>).

nanuqcz
Člen | 822
+
0
-

Někdy je ale opravdu potřeba předat komponentě v šabloně nějaký parametr.

fikus1234: Jde to, ale parametry se předají přímo komponentě do metody render.

// v šabloně
{control nazev $vstup}
// komponenta
class NazevControl extends Control
{
    public function render($vstup)
    {
    	# zde je $vstup k dispozici
    }
}
// v presenteru
class FooPresenter extends BasePresenter
{
    public function createComponentNazev()  // zde bez parametrů
    {
    	return new NazevControl();
    }
}

(Pozn.: Bohužel v dokumentaci o tomto nic není, jak jsem právě zjistil :-( )
EDIT: Tak je, ale tak trochu nepřímo :-) https://latte.nette.org/cs/tags#…

Editoval nanuqcz (28. 3. 2012 11:06)

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

Správná odpověď, jen doplním: v šabloně lze ty parametry předávat, ale pokud bych se ptal kdy tam něco předávat, tak jen takové údaje, které jsou závislé na konkrétním umístění makra {control ...} (v praxi jsem to tak využil například na předání informace, jestli jsem komponentu vykresloval v lichém řádku…). Jinak všechno nastavování komponenty, předávání parametrů a argumenutů je lepší (správné) dělat v PHP kódu, ať už v presenteru, nebo třeba mimo něj (pokud si komponentu do presenteru předávám pomocí Dependency Injection). Prostě ne v šabloně :)

awsickness
Člen | 98
+
0
-

predavat parametry v sablone neni idealni a podle me spatne.
lepsi reseni si pripravit potrebne veci dopredu a pak se na ne odkazovat.

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

awsickness napsal(a):

Pokud jsou to parametry definované až v šabloně, proč by to mělo být špatné? Návrh Nette je v pořádku, předávají se až do metody render(), která je až v šabloně volána.

awsickness
Člen | 98
+
0
-

podle mych zkusenosti co mam tak cokoli se definuje v sablone se muze pokazit vyhodit exception a to je docela pozde pak se ti vykresli pulka stranky a zbytek etc. od predavani veci v sablone jsem proste odesel

Ani
Člen | 226
+
0
-

Pak je tu myslím pořád ten problém s nepředáním těch render parametrů při ajaxovém překreslování.

fikus1234
Člen | 23
+
0
-

Diky. nanuqcz.
Opravdu dostavam spravnou hodnotu:

class chartControl extends Control
{
public function render($vstup)
{
echo $vstup;
 }
}

, ale nevim jak to v komponente priradit nejake promenne (viz. return new chartControl();)
Muzes jeste natuknout?

awsickness
Člen | 98
+
0
-

fikus to prirazujes az v metode render
takze pokud chces neco delat tak napriklad takto

class Componenta extends Control{


public class render($vstup){
	$this->doSomething($vstup);
}

private function doSomething($vstup){
//	tady neco provadim treba
$this->param = $vstup;
}

}

ale jak rikam lepsi si dane promene pripravit a primo je davat pri new Component

fikus1234
Člen | 23
+
0
-

Vec se ma tak, ze je na jedne strance kvanta drive pripraveneho kodu (nacita se hodne veci z DB a vykresluje se spolecne s velkym mnozstvim formularu a js popup oken do layoutu)
Ve {foreachi} prochazi jednotliva id a vykreslovany formulare.

Ted potrebuju pridat ke kazde sade dat js graf, ktery se vykresluje do <div> s danym id.
Ten graf se vykresluje v komponente a do ni prave potrebuju promennou, ktera se v sablone prochazi foreachem.

Posledni prispevek mi moc nepomohl, neco zrejme delam spatne. Nevim jak v presenteru createComponent metode prevzit ta data z Componenty (napr. z $this->param = $vstup;). Jak se na tuto promennou v presenteru odkazovat?

awsickness
Člen | 98
+
0
-

posli sem kod te sablony

fikus1234
Člen | 23
+
0
-

Je to hrozne dlouhe, tak jen naznak – tech grafu tam je hodne a potrebuju na divy odkazovat podle promenne $info->measurement_info_id

{foreach $measurement_infos as $info}


{control chart $info->measurement_info_id}

<div id=„graf_layout_{$info->measurement_info_id}“ style=„border: 1px solid; width:600px; height:300px; margin: 20px 0px 20px 0px;“></div>


{/foreach}

awsickness
Člen | 98
+
0
-

tak na tohle by se hodil multiplier a v momente kdy budes delat s multiplier muzes zavolat s timto parametrem i nejakou funkci v presenteru nebo si sahnout primo na objekt ktery si predem pripravis. moznosti je hodne.

nanuqcz
Člen | 822
+
0
-

A na téma multiplier ti každý (včetně mě) určitě doporučí super video z jedné přednášky na Poslední sobotě :-)

fikus1234
Člen | 23
+
0
-

Takze opustit predchozi pokusy s render a doSomething a mrknout na multiplier, ok? :)
Diky, zkusim.. Snad to doladim a nebudu se dal ptat.

Ascaria
Člen | 187
+
0
-

fikus1234 napsal(a):

Takze opustit predchozi pokusy s render a doSomething a mrknout na multiplier, ok? :)
Diky, zkusim.. Snad to doladim a nebudu se dal ptat.

Pokud to není moc obtížné, tak bych zkusil ten foreach dát ještě do komponenty, tzn aby komponenta uměla zobrazit všechny záznamy a ne jen jeden. Pak si můžeš data předpřipravit v createcomponent. Neboj se udělat velkou komponentu, nemusí to být skrček. :)

Editoval Ascaria (30. 3. 2012 12:23)

fikus1234
Člen | 23
+
0
-

Cele to obalit komponentou je problem, protoze je tam opravdu dost casti vcetne vetsiho mnozstvi formularu, jednotlive casti se zobrazuji na onclick apod. :-/

Ascaria
Člen | 187
+
0
-

Tak co třeba místo createcomponent si vytvářet v každé iteraci new component přímo v šabloně a předávat jí tu proměnnou třeba konstruktorem (sice to není ideální, ale myslím, že to ve výsledku vyjde úplně nastejno):

{foreach $measurement_infos as $info}
 …
 …
 {var $x = new Measure($this->presenter, 'name', $info->measurement_info_id)}
 {$x->render()}

<div id=„graf_layout_{$info->measurement_info_id}“ style=„border: 1px solid; width:600px; height:300px; margin: 20px 0px 20px 0px;“></div>
 …
 …
 {/foreach}

Editoval Ascaria (1. 4. 2012 23:25)