====== 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/[[Le api|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.\\ \\ ... ... \\ 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/[[le api|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 //[[le api|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 | \\ \\ \\ \\ [[smarty, le viste e opendcn | indietro]] - [[le api | avanti]] \\ \\ \\