- Drupal
Geocoder_Autocomplete: Drupal 7 to 8 Module Migration
Durante l’ Hackaton svoltosi come parte dell’Italian Drupal Day 2015 di Bologna,
io (itamair) sono stato impegnato nello sviluppo di una possibile versione Drupal 8 del modulo Geocoder_Autocomplete, assieme ad altri membri della community Drupal (cronos, rafael92, gik000)
Questo modulo è molto semplice. Nella sua versione per Drupal 7 si compone di un hook_menu e di una funzione di callback in cui è concentrata la sua principale logica applicativa: chiamare un webservice di Google che restituisce in real time gli indirizzi di auto-completamento per le geo location processate sulla base della stringa imputata dall’utente.
Il modulo crea ed espone uno specifico widget per il campo testo in cui attivare queste funzionalità.
Proprio la semplicità di questo modulo ha favorito la comprensione della logica di base per il porting e la costruzione dei moduli in Drupal 8.
Come prima cosa è stato necessario verificare di avere una versione compatibile di PHP ( >= 5.5.9), e scaricare la versione più recente di Drupal 8.
Strumenti indispensabili per gli sviluppatori di moduli in Drupal 8 sono anche Drush, in versione 7 e Composer.
Con questi è possibile utilizzare il Drupal Module Upgrader (DMU) come utilizzo strumento di analisi e “kickoff” nella migrazione del modulo da D7.
Una volta messo il modulo in versione D7 nella cartella dei moduli di Drupal, DMU permette di utilizzare i seguenti comandi:
- drush dmu-analyze MODULE_NAME, per analizzare il codice ed ottenere un report di quanto è necessario aggiornare;
- drush dmu-upgrade MODULE_NAME, per ottenere una prima versione automatica del codice aggiornato;
Ovviamente questo è uno strumento (molto) utile ma non esaustivo, ed anche nel caso del semplice modulo geocoder_autocomplete ha rappresentato solo un primo passo per il porting del modulo.
Il resto del lavoro è stato svolto scrivendo codice a mano, con l’indispensabile supporto di PhpStorm,
integrato con le estensioni ed i plugin per Simfony, Drupal ed i Drupal Coding Standards.
In sostanza il nuovo modulo finale proposto si compone dei seguenti files:
- geocoder_autocomplete.info.yml: contiene la definizione e la firma del modulo
- geocoder_autocomplete.module: contiene le funzioni di callback e gli hooks a disposizione del modulo
- geocoder_autocomplete.permissions.yml: elenca i permessi definiti dal modulo
- geocoder_autocomplete.routing.yml: definisce le “routes”, ed i metodi dei controllers che faranno da callbacks
- geocoder_autocomplete.services.yml: definisce i servizi che vengono utilizzati dal modulo
- src/GeocoderJsonConsumer.php: la definizione del servizio custom (e riutilizzabile) che espleta la logica applicativa di geocoding, attraverso il webservice di google;
- src/Controller/GeocoderController.php: la definizione della classe controller del modulo, e del metodo che fa da callback alla route, e che utilizza il servizio di geocoding, attraverso dependecy injection
- src/Plugin/Field/FieldWidget/GeocoderAutocomplete.php: la definizione del geocoder_autocomplete field widget, come estensione dei campi “stringa”
Lo schema in figura è utile per meglio comprendere le differenze tra Drupal 7 e Drupal 8, la frammentazione delle logiche funzionali e del codice in diversi più files (almeno nel caso di un modulo così semplice).
In allegato questa versione D8 del modulo geocoder_autocomplete, così come inviata in data alla community su drupal.org: https://www.drupal.org/node/2633962