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
naveseni callback eventu. tohle máš v dokumentaci k nette. proč se na to ptas tady?
Začátečník Nette
Profil
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
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();
Ten udělá to, že po zavolání metody bar nad objektem foo vypíše hello world. No a teď si vem, že to nechceš spustit hned, ale třeba až uvnitř nějaké funkce. Tudíž musíš do té funkce nějak dostat informaci, že se má spustit nějaká funkce na nějakém objektu. Ovšem nemůžeš tu metodu zavolat, když voláš tu funkci. 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"]);
Ten callback může mít vícero forem. << tohle je důležité si přečíst

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'];
Do pole atributu 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
Keeehi [#4]: Díky za objasnění.
Kcko
Profil
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á).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0