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 |