Predani vstupni promenne komponente
- fikus1234
- Člen | 23
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:
- v presenteru pripravit sadu dat
- v sablone nejak predat data: {control nazev $vstup} – jde to?
- v presenteru udelat neco jako
public function createComponentNazev($vstup)
{
zpracovani vstupu;
return $vystup;
}
Nebo jak elegantneji tam ta data dostat?
- nanuqcz
- Člen | 822
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
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 až v šabloně :)
- awsickness
- Člen | 98
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
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
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
- awsickness
- Člen | 98
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
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?
- fikus1234
- Člen | 23
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
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
A na téma multiplier ti každý (včetně mě) určitě doporučí super video z jedné přednášky na Poslední sobotě :-)
- Ascaria
- Člen | 187
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)
- Ascaria
- Člen | 187
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)