Appena preso in mano il
mattone Pro Drupal Development (Second Edition) si può avere l'impressione di sfogliare un testo molto grande e con svariate parti inutili, come sovente accade con pubblicazioni di tali dimensioni. Ci si accorge presto però che la prima impressione è decisamente sbagliata: già dopo aver letto i primi capitoli, infatti, con uno sguardo al cielo si può asserire con convinzione di avere tra le mani la
Bibbia di
Drupal, tra l'altro aggiornata all'ultima versione stabile disponibile, la 6.x.
Dries Buytaert, fondatore e capo progetto di
Drupal, ci introduce alla lettura di quest'opera, quasi chiedendoci di partecipare attivamente alla community di sviluppo del prodotto e dei suoi moduli.
Il testo è pensato per chi vuole imparare a lavorare con Drupal e ha già una discreta conoscenza della programmazione con PHP e database.
Il
primo capitolo,
How Drupal Works, è un'anteprima del framework: ci si accorge da subito che
Drupal non è un banale CMS, ma include al suo interno delle potenzialità di sviluppo e
customizzazione enormi e dagli standard molto elevati; vengono illustrati i suoi concetti chiave come
hook, nodi, moduli ecc. Molto interessante anche la parte in cui viene esplicitato il percorso di gestione di una
request e generazione della
response.
Con le idee più chiare sulla parte teorica, si passa al
secondo capitolo,
Writing a module, in cui si saggiano solo alcune delle potenzialità a disposizione, si entra nell'ottica della
hook programming (punto forte di
Drupal) e si capisce come tutto sia abbastanza facile da realizzare, previa la conoscenza di non poche convenzioni utilizzate, che entreranno via via nella testa dello sviluppatore. Qui
si realizza da zero un modulo: si parte della creazione di un file di informazioni per l'installazione automatica da parte del sistema, si vede come creare una sezione di amministrazione del modulo, come salvare e recuperare le preferenze, come installare e disinstallare le tabelle per il modulo all'interno del database (sempre tramite le API messe a disposizione) e, infine, come lavorare con i form (creazione, gestione della validazione e del submit); il tutto senza scrivere la benché minima riga di HTML.
Se quanto letto ci ha stimolati, e sicuramente lo avrà fatto, allora dal
terzo capitolo si iniziano a esaminare singolarmente gli argomenti di studio.
Si parte con gli hook: cosa sono, come si creano, come si agganciano al sistema. È interessantissimo vedere come
Drupal sia totalmente personalizzabile senza richiedere mai (o veramente quasi mai) che si metta mano al codice originale scaricato. Creare un piccolo modulo a parte permette di aggiungere nuovi comportamenti, personalizzare qualsiasi cosa (anche fornita da altri moduli), senza dover nuovamente apportare le stesse modifiche ogni volta che si effettua un aggiornamento del core o dei moduli.
Poi si parla del modulo trigger e si esamina come utilizzarlo, come
customizzarlo, come mettere a disposizione eventi.
Infine si osserva come le azioni possono essere richiamate dagli hook o dai trigger.
Anche il
quarto capitolo,
The Menu System, è decisamente completo e dice tutto quello che serve sapere sui menu. In
Drupal i menu non sono semplici voci collaterali, che permettono di raggiungere una particolare destinazione, ma si occupano in tutto e per tutto del mapping tra qualsiasi URL che il sistema riceve e la risposta che deve fornire. Il capitolo inizia parlando proprio del
mapping tra URL e funzioni, esamina con maggiore dettaglio il ciclo di funzionamento delle
request, e mostra come bastino poche righe a personalizzare un menu e gli elementi della pagina, anche utilizzando parametri ricevuti dall'URL o generati nel codice. Si continua, poi, con
un'analisi della gestione dei blocchi di navigazione (inclusa la possibilità di annidare informazioni), della gestione degli accessi alle risorse e di come agisce il core del sistema riguardo alla localizzazione. Si continua ancora con percorsi costituiti da stringhe variabili da usare come parametri e con la modifica dei menu esistenti. Come si vede, 40 pagine non sono poi così tante se si deve spiegare nel dattaglio tutto quello che il sistema di gestione dei menu può fare. Il capitolo si conclude, infine, con una
lista di possibili scenari, di problemi comuni e di consigli e soluzioni per affrontarli.
Working with Databases, il
quinto capitolo, è l'ultimo in cui si affrontano argomenti che servono a capire come impostare o modificare il funzionamento base del core, a scapito delle enormi funzionalità a disposizione. Qui
si esamina il funzionamento dell'abstaction layer del database: quindi non un ORM o qualcosa di complesso, ma un semplice layer e le relative istruzioni per eseguire query di inserimento, modifica o prelievo di dati; nell'ultimo caso sono messe in evidenza varie soluzioni, tra cui le pochissime righe di codice che permettono di paginare i risultati ottentuti, integrandosi direttamente con il tema grafico selezionato. Oltre a mostrare come inizializzare e creare script
stand alone (ossia non richiamati dal core del sistema in seguito a una
request ricevuta), si esaminano le API messe a disposizione per il topic corrente. Viene fatto vedere come sia possibile l'esecuzione di istruzioni DML senza scrivere una singola parola in SQL all'installazione, update o disinstallazione di un modulo, come sia possibile il
reverse engineering da tabelle esistenti, quali siano i tipi di dati esistenti, come utilizzare quelli specifici per un determinato database, come esporre query ad altri moduli o modificare le loro, come usare database multipli e tabelle temporanee. Il capitolo si conclude con un esempio che mostra come sia semplice scrivere il driver per l'accesso a un altro database, in modo che sia compatibile e utilizzabile dall'
abstraction layer.
Il
sesto capitolo è
Working with Users e mostra come interagire con gli utenti del sistema. Innanzitutto
si vede come funziona la variabile $user, che rappresenta il singolo utente nella sessione di navigazione, e quali dati contiene; poi si continua osservando come si memorizzano in essa ulteriori dati e quali sono gli
hook per modificare il suo comportamento. Viene, poi, preso in esame il funzioanmento del processo di registrazione, quello di login e le operazioni di intervento su di essi tramite un modulo
ad hoc,
customizzandone il comportamento.
Il
settimo capitolo è il complemento naturale al precedente e si chiama
Working with Nodes. Per prima cosa si spiega esattamente all'utente cos'è un nodo, poi si vede come crearne uno personalizzato, all'interno del proprio modulo, e come modificare il comportamento dei nodi di sistema, tutto grazie ai soliti
hook. Infine si esamina come i nodi e i tipi di nodo siano memorizzati nel sistema (che siano creati dal pannello dell'amministratore o da un nostro modulo) e come viene determinato in fase di
request l'accesso al nodo stesso.
Vista l'estrema distinzione tra logica di business e di accesso ai dati rispetto alla logica di visualizzazione degli stessi,
The Theme System, l'
ottavo capitolo del testo è il minimo che si potesse dedicare all'argomento. Dopo una lista dei tre
template language supportati dal sistema e dell'ovvio consiglio di utilizzare
PHPTemplate; questo è stato sviluppato dalla comunità di
Drupal ed è renderizzato più rapidamente, in quanto non necessita di alcun parsing intermedio a differenza degli altri; si affronta quindi la costruzione di un tema utilizzando quest'ultimo sistema di template. Ciò porta, oltre a un'analisi dei file di template, anche a un esame della funzione
theme(), della modifica di elementi del tema, di una gestione delle variabili utilizzate e di ulteriori funzioni avanzate per la "temizzazione".
Il
nono capitolo,
Working with Blocks esamina un ulteriore aspetto fondamentale del sistema: i blocchi, ossia dei contenitori di testo utili per la navigazione o la visualizzazione di informazioni, posizionati in determinate aree previste dal tema. Dopo aver esaminato le differenze sostanziali che questi hanno con i nodi, si passa alla creazione e alla definizione delle opzioni per gli stessi. Ulteriori informazioni sono fornite su come essi siano renderizzati dal tema, sull'
hook messo a disposizione e su tutti i vari parametri che lo interessano.
Abbastanza corposo nel testo, perché altrettanto interessante nella pratica è l'argomento che tratta, è il
capitolo decimo,
The Form API. I form sono un altro punto forte di
Drupal e permettono, tramite alcuni uncini, la definizione del loro contenuto tramite array di array associativi (come avviene per le API del database), le operazioni di validazione e quelle successive al
submit. Oltre a una descrizione dei principali
hook e delle varie opzioni disponibili nella definizione di un
formset, viene evidenziato come realizzare form multipagina, come modificare form esistenti e come utilizzare le varie proprietà disponibili, tra cui #AHAH (
Asynchronous HTML And HTTP).
L'
undicesimo capitolo, dal titolo
Manipulating User Input: The Filter System, parla del processo che avviene tra l'invio di testo da parte di un utente e il suo utilizzo da parte del sistema per operazioni come il salvataggio o semplicemente la visualizzazione, che prende il nome di filtraggio.
Drupal dispone di tre tipi di filtri base, che possono essere personalizzati o associati a ulteriori filtri scritti dall'utente. Evidenziando i vantaggi di un sistema di filtering rispetto alla modifica del testo direttamente all'interno delle varie funzioni, il capitolo ci spiega il
comportamento dei filtri e come realizzarne uno, grazie ai dettagli sulle varie fasi.
Il
dodicesimo capitolo,
Searching and Indexing Content, inizia spiegando perché la comunità di sviluppo di
Drupal ha optato per la realizzazione di un motore di ricerca interno
customizzato, senza basarsi esclusivamente sulle funzioni di ricerca full-text messe a disposizione da alcuni motori di database. Il capitolo mostra gli
hook, che permettono ai vari moduli di utilizzare il motore di ricerca spiegando come
Drupal indicizzi i contenuti e come sia possibile personalizzare il form di ricerca.
A differenza di come si potrebbe pensare,
Working with Files, non si occupa di mostrarci solo come funziona il sistema di upload dei file, ma anche quello dei download e in generale di come
Drupal gestisca il trasferimento di file. Il sistema, infatti, permette di avere i file in una cartella pubblica - il download è così accessibile a tutti - o in una privata, occupandosi direttamente di trasferire i file qualora determinate condizioni siano verificate o meno. Viene quindi mostrato come funzionano i settaggi di PHP in relazione all'upload e come
Drupal gestisca i file multimediali anche attraverso l'ausilio di determinati moduli. Il capitolo si conclude con un
esame delle API dei file, mostrando alcuni consigli ed evidenziando, come al solito, il workflow eseguito dal core.
Continua l'ispezione dei moduli di sistema con il
quattordicesimo capitolo,
Working with Taxonomy. L'esistenza del supporto alle tassonomie all'interno del core è uno dei motivi che rendono la scelta di
Drupal appetibile da parte di molti utenti. Questo permette infatti l'esistenza di parole chiave e la relativa navigazione dei nodi tramite esse, i termini correlati da parentela (figli di un termine, figli dello stesso termine, sinonimi ecc...) e anche numerose ulteriori possibilità, come la creazione di rubriche di un giornale online, di categorie e sottocategorie per il modulo forum, ecc. Essendo questo un argomento non ancora alla portata di tutti, il testo spiega innnanzitutto
cosa sono le tassonomie, come vengono implementate all'interno di Drupal,
cosa sono i vocabolari e come sono composti. In seguito si passa alla visualizzazione dei contenuti tramite i termini per mezzo dell'URL e dell'RSS. Il capitolo continua mostrando come le tassonomie vengano memorizzate all'interno del database, e quali siano le funzioni utilizzabili durante la scrittura dei propri moduli per l'accesso a queste e l'eventuale modifica.
I
capitoli quindicesimo e sedicesimo sono rispettivamente intitolati
Caching e
Sessions. Da qui in poi i capitoli sono tutti dedicati ad un'audience leggermente più esperta del
sistema, ma questi due in particolare presentano molti argomenti che potrebbero sembrare complessi e inutili a un lettore che si appresta a sviluppare i primi moduli. Ciononostante può essere comunque interessante capire almeno come funziona il meccaniscmo di
caching (quando entra in gioco con i vari elementi) e come il sistema delle sessioni è implementato e funziona. A parte questo, comunque, ci sono una serie di ulteriori funzioni messe a disposizione per un utilizzo più efficace e avanzato, anche se complesso, del
framework.
Un capitolo a parte, precisamente il
diciassettesimo, è dedicato a
jQuery, la libreria che astrae JavaScript e fornita nell'installazione base di
Drupal; ecco perché è importante conoscerla: tutti i moduli che necessitano il supporto a questo linguaggio di scripting lato client dovrebbero (o meglio devono) fare utilizzo di questo layer. Il capitolo ci mostra brevemente come questo lavori e si focalizza sul suo utilizzo all'interno dei nostri moduli.
Il
diciottesimo capitolo forse meritava di essere trattato prima, visto che l'argomento in oggetto, anche se più difficoltoso, è basilare per il funzionamento e la comprensione di
Drupal:
Localization and Translation. Per fortuna in alcuni dei capitoli precedenti sono stati mostrati i fondamenti e spiegati i primi passi per poter lavorare con contenuti localizzati; e così ora si è giunti finalmente al capitolo che tratta il tutto con dettaglio. Qui si affronta
la localizzazione di contenuti per mezzo della funzione t() e poi si entra nel dettaglio dei file POT (
Portable Object Template), un estensione dei file utilizzati da
Drupal per l'esportazione di informazioni.
Non fondamentale, ma di certo estremamente interessante, è
XML-RPC, il
diciannovesimo capitolo, che illustra come trarre vantaggio dal supporto integrato fornito per le
Remote Procedure Call: si vede per prima
cosa come effettuare delle chiamate e poi come implementare un meccanismo di risposta. Chiaramente anche qui, tra le varie cose, vengono evidenziati gli
hook da utilizzare e, in generale, le varie API a disposizione.
Seguono, poi, i
capitoli dal ventesimo al ventiduesimo, rispettivamente
Writing Secure Code,
Development Best Practices e
Optimizing Drupal. Sono dei capitoli che andrebbero affrontati esclusivamente dopo aver raggiunto una forte padronanza con lo sviluppo di moduli del
framework. In teoria si potrebbe obiettare a questa considerazione, riflettendo che quando si decide di lavorare su progetti che hanno convenzioni, è una buona regola documentarsi bene su di esse prima di procedere; tuttavia, c'è da tenere conto che dopo aver letto e studiato le prime 450 pagine e appreso così tanti concetti, ci si accorge che sarebbe impensabile credere di poter affrontare questi tre capitoli prima di tutto il resto.
Installation Profiles è il
ventitresimo capitolo.
I profili d'installazione di Drupal sono dei particolari file che contengono informazioni, le quali a loro volta forniscono dettagli sulla configurazione da attuare nel sistema. Pertanto tramite essi, contenuti in file, è possibile configurare in un determinato modo il sistema, abilitando o meno specifici moduli e settando oppurtunamente i dovuti parametri.
Drupal potrebbe essere usato come un CMS, un giornale online, un blog, un sito per il commercio elettronico, un portale tematico, un forum e così via; tutto questo è possibile grazie alle grandi possibilità di personalizzazione e grazie ai vari moduli integrati correttamente tra loro; e di certo i profili d'installazione facilitano enormemente il compito. Ecco perché essi non andrebbero definiti utili, ma fondamentali.
L'
Appendice A,
Database Table Reference, fornisce, per ognuna delle tabelle presenti in fase d'installazione, il dettaglio sul modulo che le utilizza e sui vari campi che le compongono. Infine
Resources, l'
Appendice B, conclude il testo, subito prima di un corposo indice, con una serie di risorse utili, come quelle relative al codice sorgente e quelle inerenti le varie comunità di sviluppatori, come mailing list, forum, canali IRC, ecc.
Tutto sommato si può sostenere che l'autore,
John K. VanDyk, sviluppatore di lunga data e web architect, abbia fatto decisamente un buon lavoro, seppur con qualche limite. Veramente ottima, ad esempio, l'idea di concepire il testo affinché sia subito possibile per il lettore focalizzare un determinato livello di conoscenza, anziché un altro:
i diagrammi, infatti, forniscono informazioni di massima, facilitando l'apprendimento e soprattutto la memorizzazione e il richiamo successivo dei concetti; i frammenti di codice o gli esempi di moduli, presenti quasi per tutti i capitoli, permettono di imparare e ricordare immediatamente come implementare un determinato comportamento in maniera pratica; il testo, con osservazioni, consigli e trattazioni teoriche, si pone come il perfetto collante tra gli altri due.
Gli esempi, ottimi e utilissimi, però presentano una nota dolente: spesso non sono corretti o coerenti con i codici sorgenti disponibili. E a tale proposito ci si accorge ben presto che consultare l'
errata corrige del testo è quasi un'impresa degna di medaglia finale: veramente troppo estesa per un testo che vanta la presenza di un revisore tecnico con tanto di curriculum.
Come tutti i volumi che vogliono essere l'unico punto di riferimento completo per un argomento, anche questo ha lo svantaggio di essere a volte troppo prolisso nel trattare determinati argomenti: tutti sono necessari, ma questo porta comunque il lettore a perdere l'attenzione su alcuni dettagli. Mi spiego: un testo di questo tipo andrebbe letto interamente da principio, assimilato, e riletto a salti quando serve qualcosa che non si ricorda; quando le nozioni sono però così tante è difficile seguire un iter di questo tipo, senza perdersi all'interno di quasi ogni argomento. In aggiunta, tutto ciò comporta che il passaggio dalla lettura del testo alla scrittura di un modulo sia tutt'altro che immediato.
Insomma, il testo si presta bene per l'apprendimento dello sviluppo con
Drupal, ma è ottimo soprattutto come riferimento in fase di sviluppo, se associato a ricerche di soluzioni sul Web e all'interno dei vari gruppi di discussione e supporto.