Questo sito utilizza cookie anche di terze parti. Per avere maggiori informazioni e per negare il tuo consenso al l'utilizzo dei cookie clicca qui. Se prosegui la navigazione acconsenti all'utilizzo dei cookie.OK
  • salta al contenuto

Documentazione openDCN

Strumenti Utente

  • Entra

Strumenti Sito

  • Ultime modifiche
  • Informativa sui cookie
Ti trovi qui: start » gli_eventi

gli_eventi

Questa è una vecchia versione del documento!


Gli Eventi

Introduzione

OpenDCN è una piattaforma costituita da moduli che interagiscono tra di loro attraverso il sistema degli eventi.
Ogni modulo compie le proprie funzioni solo al determinarsi di uno o più eventi, in questo modo si forma un metodo di lavoro secondo il quale si può conservare la modularità del sistema, con la possibilità di implementare nuove funzioni senza dover modificare la struttura già esistente.

Il pattern di riferimento per la gestione degli eventi si chiama “Implicit invocation”: ogni controller è registrato come “listener”, ovvero colui che aspetta il verificarsi di un'azione/evento alla quale risponde con un'altra azione.
In questo modo il singolo controller non è a conoscenza di ciò che accade a livello generale, ma risponde solo ad una specifica richiesta invocata da un altro controller.

La gestione in openDCN

OpenDCN gestisce gli eventi in questo modo:
per ogni controller esiste un file XML dove vengono inseriti gli eventi a cui risponde il controller stesso.
Il file si trova sempre all’interno di questo path: home/app/apis/nomeapi/nomeapi_event_handler.xml

Per far si che un controller risponda al verificarsi di un nuovo evento, basta inserire l’evento stesso nell’elenco all’interno di questo file, rispettando questa sintassi:

Esempio – agenda_event_handlers.xml:
Vogliamo aggiungere l’evento “permissionGetAction” all’elenco degli eventi a cui risponde l’agenda. Questo evento serve per capire i permessi relativi alle azioni che si possono fare all’interno dell’agenda.

  <handlers>
  ...
  <handler name="permissionsGetActions" event="Permissions.getActions"/>
  ...
  </handlers> 


Le funzioni che permettono di creare e gestire gli eventi sono definite principalmente nei file event_classes.php, event_parser.php e bootstrap.php che si trovano nella cartella home/app/apis/core.

Nel file event_classes.php sono definite le classi per creare eventi, nel file event_parser.php sono definite le funzioni che convalidano gli eventi presenti nel sistema ed il file bootstrap.php serve per far azionare l’effettivo parser degli eventi.

Le funzioni che descrivono le azioni dei controller per ogni evento cui rispondono sono definite, per ogni controller, nel file nomeapi_api_controller.php situato in apis/nomeapi/nomeapi_api_controller.php.

Esempio – agenda_api_controller.php:

  function permissionsGetActions() {		
     return array('admin' 	=>	$this->s('PERMISSION_ADMIN_DESCRIPTION'),
		'view' 		=>	$this->s('PERMISSION_VIEW_DESCRIPTION'),
		'create'	=>	$this->s('PERMISSION_CREATE_DESCRIPTION'),
		'upload'	=>	$this->s('PERMISSION_UPLOAD_DESCRIPTION'),
		'rate'		=>	$this->s('PERMISSION_RATE_DESCRIPTION'),
		'download'	=>	$this->s('PERMISSION_DOWNLOAD_DESCRIPTION'),
		'edit' 		=>	$this->s('PERMISSION_EDIT_DESCRIPTION'),
		'delete' 	=>	$this->s('PERMISSION_DELETE_DESCRIPTION'),
	);		
}


Infine, per notificare l’evento a tutti i controller, è stata creata la funzione notify, utilizzata dalla classe EventHandler nel file event_classes.php.
I controller riceveranno la richiesta e risponderanno attraverso la loro funzione corrispondente.

Funzione notify():

  static function notify($context,$event,$params = array(),$make_plain_array = false, $controller = null) {
	$eventObj = new EventHandler($context);
	return $eventObj->_notify($event,$params,$make_plain_array, $controller);
}


Esempio – permission_controller.php:
Il modulo dei permessi invoca la notify() che viene ricevuta da tutti i moduli registrati a quell'evento (getActions) - quindi anche dal modulo agenda - che risponde con la funzione di cui sopra (permissionsGetAction()).

  …
  $actions = $this->notify('Permissions.getActions');
  …




ESEMPIO n°2:

Se la nostra applicazione avesse differenti controller che rappresentano la logica di localizzazione di diversi tipi di dati (Case, Hotel, etc.) e noi volessimo visualizzare tutti questi dati su una sola mappa, sarebbe sufficiente registrare ogni controller sopramenzionato all’evento Locations.showOnMapKml.
Nel nostro esempio, fra le altre, nel file XML di uno dei controller listener (per esempio quello che rappresenta la localizzazione degli Hotel) troveremmo la seguente entry:

  <handlers>
  ...
  <handler name="showLocationKml" event="Location.showOnMapKml"/>
  ...
  </handlers>


Per poter visualizzare la mappa, e quindi per cercare tutti i dati in una sola volta, non rimane che scatenare l’evento Location.showOnMapKml all’interno del controller principale della mappa attraverso la seguente notifica:

  ...
  $items = $this->notify('Location.showOnMapKml');
  ...


A questo punto tutti i listener risponderanno a questo evento con un vettore contenente le locazioni e dati ulteriori che possiamo visualizzare immediatamente sulla mappa.



Elenco di tutti gli eventi sino ad ora registrati (v.1.5):

EVENTO MODULO che RISPONDE DESCRIZIONE
Menu.registerMenuItem content; event; users Risponde l'elenco dei propri oggetti presenti nel menu
Blockset.blocksMap locations; posts; menu; notifications; content; agenda Risponde con un array contenente le caratteristiche dell'istanza del controller che risponde
Permissions.getSubjects users; groups Risponde con la lista dei soggetti che hanno permessi di compiere azioni sul modulo che chiama l'evento
Permissions.getActions polls; markerset; posts; users; menu; meeting; infodiscs; ligh_poll; groups; blockset; notifications; content; permissions; agenda; wikitool Risponde con la lista delle azioni definite nel modulo che chiama l'evento
Permissions.getObjects polls; markerset; posts; users; menu; meeting; infodiscs; light_poll; groups; blockset; notifications; content; permissions; agenda; wikitool Risponde con la lista delle istanze dei moduli su cui sono definiti i permessi
Permissions.getRoles polls; meeting; infodiscs; agenda; wikitool Risponde con la lista dei ruoli attivi all'interno dei moduli che chiamano l'evento
Locations.showOnMap posts; agenda Risponde inviando le coordinate di localizzazione per l'inserimento nella mappa
Locations.legenda posts; agenda Risponde ritornando la legenda utile alla visualizzazione
Users.delete posts; infodiscs; light_poll Risponde con la cancellazione di un utente
Agenda.callForTools polls; meeting; infodiscs; lightpoll Richiede informazioni sullo strumento che risponde all'evento
Tools.whoIsMyParent users; agenda Richiede un array con le informazioni dello strumento che risponde all'evento
Tools.whoAreMySiblings agenda Richiede un array con le informazioni dello strumento che risponde all'evento
Tools.whoIsOfASpecies agenda Richiede un array con le informazioni sugli strumenti utilizzati dal modulo che risponde all'evento
Notifications.info posts; infodiscs Richiede le informazioni sulle notifiche fatte al modulo che risponde all'evento
gli_eventi.1274966260.txt.gz · Ultima modifica: 05/06/2013 17:08 (modifica esterna)

Strumenti Pagina

  • Mostra sorgente
  • Revisioni precedenti
  • Puntano qui
  • Torna su
Ad eccezione da dove è diversamente indicato, il contenuto di questo wiki è soggetto alla seguente licenza: CC Attribution-Noncommercial-Share Alike 3.0 Unported
CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki