{control myForm, 5} – da se nejak pristoupit k parametru z createComponentMyForm(){}?

- Vojtěch Dobeš
- Gold Partner | 1316
Nedá. Parametry předané makru {control} se předávají
metodě render() dané komponenty, kterážto je v továrničce
teprve vytvářena.

- Vojtěch Dobeš
- Gold Partner | 1316
Obecně platí pravidlo, že šablona by nikdy neměla ovlivňovat nic v presenteru. Je to prostě koncový bod, taková je architektura. Ať už potřebuješ cokoli, určitě se najde cesta, kdy nebudeš potřebovat z šablony ovlivňovat tvorbu komponenty.

- simPod
- Člen | 383
komponenta je formular, ktery obsahuje jeden submit button a jeden hidden field
parametr vyplnuje hodnotu hidden fieldu
jedna se o pridavac do kosiku kde parametr predstavuje id zbozi
na strance s produktem jsem takovyhle formular mel, tak me napadlo ho pouzit i na strance s vice produkty najednou, ke kazdemu produktu vykreslit jeden formular s odlisnim id
kazdopadne asi bude cistsi to udelat pres signal…

- Vojtěch Dobeš
- Gold Partner | 1316
Asi bude. Nicméně co by ti pomohlo je Multiplier. Slouží doslova k „násobení“ komponent :). A není o něm v dokumentaci ani zmínka (zatím). Výborně o něm povídal Honza Tvrdík. Prakticky:
protected function createComponentMyForm()
{
return new Nette\Application\UI\Multiplier(function ($id) {
$form = new Form;
// ... bla bla bla ...
// $id lze použít třeba k tomu nastavení hidden fieldu
return $form;
});
}
Jak se bude renderovat?
{control myForm-$id}

- nanuqcz
- Člen | 822
V tom případě by podle mě neměl být problém přepsat metodu render formuláře…
class MyForm extends Form {
function __construct() { ... }
function render($id) {
$this['product_id']->setDefaultValue($id);
parent::render();
}
}
EDIT: Vlastně vojtech.dobes má pravdu, poslechni jeho :-)
Editoval nanuqcz (8. 5. 2012 23:43)

- simPod
- Člen | 383
2vojtech.dobes
ten multiplier vypada zajimave, ale nechce mi brat
$form->onSuccess[] = callback($this, 'addToCartSubmitted');, Undefined variable: this
2nanuqcz
to je oproti multiplieru moc komplikovane ne? navic si nemuzu jednoduse sahnout
na funkce a prommene v prezenteru a musim je vsechny poslat v konstruktoru
nemylim-li se

- vvoody
- Člen | 910
simPod napsal(a):
2vojtech.dobes
ten multiplier vypada zajimave, ale nechce mi brat$form->onSuccess[] = callback($this, 'addToCartSubmitted');,Undefined variable: this
jednoducho:
if($form->isSuccess()){
... // obsah funkcie addToCartSubmitted
}
zlozito:
celkom pekne by bolo si vytvorit triedu rozsirenim Nette\Application\UI\Form,
predat zavislosti cez konstruktor (connection/session – neviem kam si ten
kosik ukladas) a logiku budes mat pekne odelenu od presenteru v ktorom bude len
tovarnicka
protected function createComponentMyForm()
{
return new Nette\Application\UI\Multiplier(function ($id) {
return new MojSuperForm($id/* dalsie zavislosti */);
});
}

- simPod
- Člen | 383
me se libi ta jednoducha metoda ale to mi vraci
Form is not anchored and therefore can not determine whether it was submitted.
Zjistil jsem, ze to ma neco spolecneho s vice objekty a ze nejsou ve stromu,
ale nevim, jak to opravit v tomhle pripade.
kdybych pouzil druhou metodu, jak si pak z tovarnicky ve funkci, co zavolam
po odeslani formulare sahnu treba na jinou komponentu
($this['nejakaKomponenta'] asi nebude fungovat) nebo na promennou
prezenteru (nejaka alternativa pro
$this->prezenterPromenna ?)
a jaky vyznam by pak mel multiplier, resp. k cemu je mi pak dobry, kdyz uz
bych mel tridu vedle a id muzu predavat v render() ?

- vvoody
- Člen | 910
na ten error pomoze
protected function createComponentMyForm()
{
return new Nette\Application\UI\Multiplier(function ($id) {
$form = new Form($this,'nejakyNazov'); // toto je pre Nette\Application\UI\Form
// $form = new Form('nejakyNazov'); takto pre Nette\Forms\Form
// ... bla bla bla ...
// $id lze použít třeba k tomu nastavení hidden fieldu
return $form;
});
}

- Vojtěch Dobeš
- Gold Partner | 1316
Ten problém s $this jsi vyřešil? V anonymní funkci
samozřejmě $this není k dispozici, je třeba si ho tam předat closurou:
$that = $this; a pak
function ($id) use ($that) { ....
voody bacha na to $this, mateš lidi ;)
Editoval vojtech.dobes (9. 5. 2012 0:19)

- Vojtěch Dobeš
- Gold Partner | 1316
vvoody napsal(a):
jednoducho:
if($form->isSuccess()){ ... // obsah funkcie addToCartSubmitted }
Toto je pěkná blbost – callbacky na onSuccess už touhle
kontrolou prošly.

- vvoody
- Člen | 910
simPod napsal(a):
kdybych pouzil druhou metodu, jak si pak z tovarnicky ve funkci, co zavolam po odeslani formulare sahnu treba na jinou komponentu ($this['nejakaKomponenta']asi nebude fungovat) nebo na promennou prezenteru (nejaka alternativa pro$this->prezenterPromenna?)
To su tie zavislosti, tie sa predavaju cez kostruktor, napriklad nejaky
model.
K tym ostatnym komponentam: ak bude ta tvojna nova trieda MojSuperForm
extendovat z Nette\Application\UI\Form
tak potom budes mat moznost ziskat presenter
$this->getPresenter();
//alebo
$this->presenter;
a z neho sa dostanes ku komponentam

- Vojtěch Dobeš
- Gold Partner | 1316
vvoody napsal(a):
na ten error pomoze
$form = new Form($this,'nejakyNazov'); // toto je pre Nette\Application\UI\Form
Tohle je taky blud, parenta a název není potřeba v konstruktoru
předávat, pokud je z továrničky instance vrácena (což je, viz
return).

- vvoody
- Člen | 910
vojtech.dobes napsal(a):
vvoody napsal(a):
na ten error pomoze
> $form = new Form($this,'nejakyNazov'); // toto je pre Nette\Application\UI\FormTohle je taky blud, parenta a název není potřeba v konstruktoru předávat, pokud je z továrničky instance vrácena (což je, viz
return).
viem, ale ten error to „fixlo“, nepytaj sa ma preco, :) dnes mi vybehol tiez, presne na tom riadku s isSuccess(). Samozrejme ze normalne pouzivam callback, toto som pouzil lebo som chcel nieco rychlo otestovat.

- vvoody
- Člen | 910
simPod napsal(a):
2vojtech.dobes
ten multiplier vypada zajimave, ale nechce mi brat$form->onSuccess[] = callback($this, 'addToCartSubmitted');,Undefined variable: this
teraz vlastne mozes asi pouzit
$form->onSuccess[] = callback($that, 'addToCartSubmitted');
neuvedomil som si to hned :)

- Ot@s
- Backer | 476
simPod napsal(a):
2vojtech.dobes
ten multiplier vypada zajimave, ale nechce mi brat$form->onSuccess[] = callback($this, 'addToCartSubmitted');,Undefined variable: this
protected function createComponentMyForm()
{
$obj = $this;
return new Nette\Application\UI\Multiplier(function ($id) use ($obj) {
$form = new Form;
// ... bla bla bla ...
$form->onSuccess[] = callback($obj, 'addToCartSubmitted');
return $form;
});
}