Autor | Zpráva | ||
---|---|---|---|
Začátečník Nette Profil |
Zdravím,
prosím co znamená tento zápis v Nette: $form->onSuccess[] = [$this, 'commentFormSucceeded']; Děkuji za odpověď. |
||
Kcko Profil |
#2 · Zasláno: 20. 2. 2020, 18:28:36
naveseni callback eventu. tohle máš v dokumentaci k nette. proč se na to ptas tady?
|
||
Začátečník Nette Profil |
#3 · Zasláno: 20. 2. 2020, 20:26:47
Kcko:
„naveseni callback eventu. tohle máš v dokumentaci k nette. proč se na to ptas tady?“ A tohle právě potřebuju nějak polopaticky vysvětlit. Dokumentaci k nette jsem četl, ale nějak nechápu. Díky |
||
Keeehi Profil |
#4 · Zasláno: 20. 2. 2020, 22:46:59
Je to způsob, jak zavolat metodu na nějakém objektu.
Mějme tento jednoduchý příklad. class Foo { function bar() { echo "hello world"; } } $foo = new Foo(); $foo->bar(); differentContext($foo->bar()) { To by se to totiž provedlo ještě před zavoláním té funkce a dovnitř by se předala jen návratová hodnota metody bar (tady null, jelikož metoda bar nic nevrací). Musíš to tedy udělat jinak. Předáš do té funkce ten objekt a pak mu řekneš, jakou metodu to má vlastně zavolat.
function differentContext($object, $methodName) { $object->$methodName(); } differentContext($foo, "bar"); Je to podobné jako jako proměnné proměnné. $foo = "bar"; $$foo = "hello world"; echo $bar; No jo, jenže co když my nebudeme chtít jako callback volat metodu nad nějakým objektem, ale jen nějakou obyčejnou funkci. Tedy ne že by nešla ta funkce differentContext upravit tak, aby druhý parametr byl nepovinný a uvnitř rozlišovat, zda chceme volat metodu nad objektem, nebo obyčejnou funkci. Jenže to by bylo zbytečně moc práce. Ona totiž existuje funkce call_user_func, která tohle zvládne rozlišit sama. Je jí ale potřeba předat správný parametr. Pokud se jedná o funkci, tak jen jméno té funkce. Pokud se jedná o metodu, pak chce pole, kde první prvek je objekt, nad kterým se má metoda zavolat a druhý prvek pole je jméno té metody. call_user_func("phpinfo"); // zavolá funkci phpinfo(); call_user_func([$foo, "bar"]); // zavolá metodu bar nad objektem foo => $foo->bar() Tudíž když to dáme dohromady vznikne nám toto. class Foo { function bar() { echo "hello world"; } } function differentContext($callback) { call_user_func($callback); } differentContext([$foo, "bar"]); Mno a jelikož jsme líní pořád psát call_user_func tak existuje varianta, že tu proměnnou zavoláš, jako by to byl funkce call_user_func($callback); /*je stejné jako*/ $callback(); /*dokonce tomu můžeš předat i nějaký parametr*/ $callback("abcd"); V Nette je to pak celé schované zde. Když se formulář zvaliduje, zavolá se metoda invokeHandlers (obdoba naší funkce differentContext), které se předá pole callbacků uložených v atributu onSuccess. Volání zde. V té metodě invokeHandlers se projde to pole callbacků a postupně se všechny zavolají. Závěrem tohoto elaborátu by ti tedy už mělo být jasné co znamená $form->onSuccess[] = [$this, 'commentFormSucceeded']; onSuccess objektu $form třídy Form přidej callback [$this, 'commentFormSucceeded'] . Důsledkem tedy bude, že se po validaci formuláře zavolá metoda commentFormSucceeded ve třídě v které to máš.
|
||
Začátečník Nette Profil |
#5 · Zasláno: 21. 2. 2020, 09:53:29
Keeehi [#4]: Díky za objasnění.
|
||
Kcko Profil |
#6 · Zasláno: 21. 2. 2020, 12:36:55
Keeehi:
Slušnej elaborát, v půlce jsem se v tom začal ztrácet. Možná by stačilo napsat, že si do pole onSuccess uložíš vlastní chování funkce, které se vyvolá, až se formulář zpracuje a sám si zavolá $this->onSuccess někde ve svojí logice (což programátora už defakto nezajímá). |
||
Časová prodleva: 4 roky
|
0