Gli Eventi

Introduzione

openDCN è una piattaforma costituita da moduli che necessitano di scambiarsi informazioni; questo scambio è controllato e gestito tramite il “sistema degli eventi”. Possiamo considerare “Evento” un qualsiasi cambiamento che si verifica nel Sistema.

Ogni modulo compie specifiche azioni solo al verificarsi di uno o più determinati eventi, in questo modo si forma un metodo di lavoro basato sulla modularità, nel senso che, come in una reazione a catena, non c’è conseguenza se non si scatena la causa.
Grazie a questo meccanismo, la piattaforma gode di una struttura modulare, facilmente modellabile, in quanto ogni singolo controller non è a conoscenza di ciò che accade a livello generale, ma risponde solo ad una specifica richiesta invocata da un altro controller e questo permette di implementare nuove funzioni senza dover modificare la struttura 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.

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');
  …




Elenco di tutti gli eventi sino ad ora registrati:

EVENTO MODULO che RISPONDE DESCRIZIONE
Groups.addUser notifications Notifica l'inserimento di un utente dal gruppo
Groups.removeUser notifications Notifica la rimozione id un utente dal gruppo
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
Users.insert posts; infodiscs; light_poll Notifica l'inserimento di un utente
Agenda.callForTools polls; meeting; infodiscs; lightpoll Risponde con un array contenente le informazioni sul proprio strumento per permettere al modulo chiamante di operare
Tools.whoIsMyParent users; agenda Risponde con un array contenente la tipologia del proprio strumento, il titolo e il path di riferimento
Tools.whoAreMySiblings agenda Risponde con la lista di tutte le agende attive
Tools.whoIsOfASpecies agenda Risponde con un array contenente la tipologia di ogni agenda attiva
Notifications.info posts; infodiscs Risponde con le informazioni sulle notifiche fatte sul proprio modulo





indietro - avanti