Události – vysvětlení a základny?

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

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

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

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

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

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;
	...