Události – vysvětlení a základny?
- LuBoss
- Člen | 21
Existuje prosím ještě nějaké jiné základní vysvětlení funkce
událostí v Nette než je v dokumentaci?
[https://doc.nette.org/…/smartobject#…]
Zde tomu bohužel zcela nerozumím a nedaří se mi to zprovoznit
v praxi.
Kam vlastně přijde tento kód?
// přidám handler události
$circle->onChange[] = function($circle, $oldValue, $newValue) {
echo 'došlo ke změně';
};
- Felix
- Nette Core | 1247
Muzes si udalosti predstavit jako listenery
.
private $listeners = [];
public function add(callable $l) {
$this->listeners[] = $l;
}
public function fire() {
foreach ($this->listeners as $listener) {
call_user_func($listener, 'param1', 'param2');
}
}
Takze, kdyz pak zaregistrujes na svem objektu nejaky listener, tak ten obdrzi parametry z call_user_func. Pripadne call_user_func_array, ktere akcepujte parametry jako pole.
$obj->add(function($a, $b) {
// Let's do some work.
echo '$a=' . $a; // $a=param1
echo '$b=' . $b; // $b=param2
});
Pouziva se to napriklad na logovani nejakych aktivit, kdyz potrebujes aktualizovat vice veci naraz nebo treba kdyz zpracovavas formulare v Nette\Forms\Form.
$form->onSuccess[] = function($form) {
print_r($form->values);
};
No a Nette\Object nam to vsechno zjednodusuje.
Objekt musi dedit od Nette\Object
private $onSomeEvent = [];
// Pak si v nejake metode zavolas
function someMethod() {
$this->onSomeEvent('param1', 'param2');
}
// A je to..
Editoval Felix (10. 3. 2015 10:59)
- Tharos
- Člen | 1030
V systémech událostí se Ti potkávají třídy, které definují, jaké události jsou k dispozici (a také se starají o jejich vyvolání ve správný moment) a dále handlery, které se na ty události „navěsí“. Je to obecně observer pattern.
V Nette světě jsou těmi definičními třídami takové, ve kterých se
nacházejí ony veřejné on<EventName>
property, a handlery
jsou typicky různé anonymní funkce nebo obecně cokoliv, co je
callable
(projde i string s názvem globální funkce atp.).
Když už máš ty třídy s událostmi a připravené handlery, zbývá už
jen jejich provázání, což je to přiřazení
on<EventName>[] = ...
. Kam to umístit záleží na kontextu,
na to už není žádný univerzální recept. Existují ale určité zvyklosti,
jako například že handlery na událost onSuccess
definované
formulářem se navěšují v rámci sestavování formuláře atp.
Toliko obecně. Líp bychom Ti poradili, kdybys zabrousil do konkrétnějšího vod. :)
- LuBoss
- Člen | 21
Já jsem se asi špatně zeptal, protože se trochu stydím, že mi není
jasný ten základní princip.
Ale pokud jsem správně pochopil, tak „událost“ v Nette je situace, kdy
se funkce nějaké třídy podívá do svého globálního pole, zda mu tam
někdo náhodou nestrčil nějakou funkci k vykonání?
A podstrčení té funkce se provede právě oním „handlerem“ a bude
platit pouze pro tuto jednu instanci třídy od okamžiku aplikace handleru do
okamžiku zániku té jedné konkrétní instance třídy (modelu)?
A použití v praxi je asi takové, že v různých presenterech
používající jeden model mohu podstrkovat (navěšovat) různé handlery dle
toho, co jsem si zrovna usmyslel za reakci?
- LuBoss
- Člen | 21
Odpovím na svůj dotaz ohledně nefunkčního příkladu „událostí“
v dokumentaci
[https://doc.nette.org/…/smartobject#…]
V deklaraci proměnných třídy Circle chybí $radius.
Je tedy potřeba doplnit něco jako
class Circle extends Nette\Object
{
private $radius;
...