{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\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
).
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;
});
}