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

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

tak nejak se mi vesel dotaz do Predmetu.

Volam v sablone formular pres {control myForm, 5}

Da se nejak pristoupit k parametru (5) z createComponentMyForm(){}?

diky

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

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

nanuqcz
Člen | 822
+
0
-

Ahoj, nejde. Parametr se přenáší do metody render dané komponenty:

{control myControl, 5}
class myControl extends Control {
	function control($number) {
		$number  // zde se dostaneš k oné "pětce"
	}
}

EDIT: zase jsem byl pomalejší :-)

Editoval nanuqcz (8. 5. 2012 22:52)

simPod
Člen | 383
+
0
-

to je smutne…

no dekuji

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

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

nj, v mem pripade by to znamenalo udelat si html v uz prezenteru

jtousek
Člen | 951
+
0
-

V tom případě to máš pravděpodobně špatně navržené. Možná ti poradíme když řekneš co je to za komponentu a co představuje ten parametr.

simPod
Člen | 383
+
0
-

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

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

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

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

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

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

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

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)

simPod
Člen | 383
+
0
-

aha, $that = $this; resi vse!

diky vsem

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

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

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

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

vojtech.dobes napsal(a):
voody bacha na to $this, mateš lidi ;)

a jo, pardon :D pisem z hlavy

vvoody
Člen | 910
+
0
-

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

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

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;
        });
}