Questa è una vecchia versione del documento!
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” ( Vedi Allegato n.1): 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 | DESCRIZIONE |
---|---|---|
Menu.registerMenuItem | menu | Richiede gli oggetti presenti nel menu |
Blockset.blocksMap | blocksets | Richiede un array contenente l'oggetto del controller che risponde |
Permissions.getSubjects | permissions | Richiede la lista dei soggetti prodotti dal modulo che risponde |
Permissions.getActions | permissions | Richiede la lista delle azioni prodotte dal modulo che risponde |
Permissions.getObjects | permissions | Richiede la lista degli oggetti prodotti dal modulo che risponde |
Permissions.getRoles | permissions | Richiede la lista dei ruoli attivi per il modulo che risponde |
Locations.showOnMap | locations | Richiede le coordinate di localizzazione per l'inserimento nella mappa |
Locations.showOnMapKml | locations | |
Locations.legenda | locations | Richiede la legenda del modulo |
Users.delete | users | Richiede la cancellazione di un utente |
Users.insert | users | Richiede l'inserimento di un utente |
Users.edit | users | Richiede la modifica dei dati di un utente |
Users.login | users | Richiede conferma login utente |
Users.logout | users | Richiede conferma logout utente |
Agenda.callForTools | angendas | Richiede informazioni sullo strumento che risponde all'evento |
Tools.whoIsMyParent | tools | Richiede un array con le informazioni dello strumento che risponde all'evento |
Tools.whoAreMySiblings | tools | Richiede un array con le informazioni dello strumento che risponde all'evento |
Tools.whoIsOfASpecies | tools | Richiede un array con le informazioni sugli strumenti utilizzati dal modulo che risponde all'evento |
Notifications.info | notifications | Richiede le informazioni sulle notifiche fatte al modulo che risponde all'evento |