Novità sul progetto Joomla!, panoramica sulle nuove versioni e compatibilità con nuovi database Ing. Gabriele Pongelli Team leader e lead developer del driver PostgreSQL per Joomla!
Outline Joomla! da i numeri Il nuovo ciclo di rilascio di Joomla! Le novità per gli utenti e gli sviluppatori del progetto Che cos è la platform di Joomla! Da dove nasce e perché Joomla! incontra PostgreSQL I perché Il driver e le query I test
Joomla! da i numeri Il numero di versione che identifica Joomla segue una convenzione a tre livelli, dove ognuno definisce il significato del cambio (1.5.23, 1.6.6, 1.7.1, etc ) I tre livelli, in ordine di importanza, sono: Major Minor Maintenance Ad ogni nuovo rilascio i livelli inferiori vengono impostati a zero (1.5.23 - > 1.6.0, 2.5.x - > 3.0.0 )
Joomla! da i numeri 1. 7. 1
Joomla! da i numeri Un rilascio classificato come Major include un alto grado di cambiamenti se comparato con il rilascio precedente. Generalmente cambiamenti di questo genere includono un massiccio cambio nell architettura e/o nell interfaccia. Anche cambi sostanziali nel datamodel sottostante possono causare un rilascio Major
Joomla! da i numeri Un rilascio classificato come Minor indica un alto grado di continuità presente nell architettura e nel datamodel rispetto al rilascio precedente. In questi rilasci le funzionalità esistenti vengono mantenute ed eventualmente migliorate, rispetto al rilascio precedente
Joomla! da i numeri Un rilascio classificato come Maintenance viene effettuato perché risolve bug, vulnerabilità di sicurezza e solamente problemi di usabilità Le nuove funzionalità non sono introdotte, a meno che non risolvano un problema con il precedente rilascio che deve essere risolto prima della prossima Minor release
Joomla! da i numeri Con una serie di rilasci Maintenance siamo passati dalla 1.6.0 alla 1.6.6 Dalla 1.6.6 siamo passati alla 1.7.0 con un rilascio Minor e successivamente, con un rilascio Maintenance, ci troviamo ora alla 1.7.1 A gennaio avverrà il rilascio della prossima versione stabile, Joomla! 2.5 Inizialmente era 1.8, ora si chiamerà 2.5, diamo proprio i numeri!
Da 1.8 a 2.5 Il cambio di numerazione è stato scelto dalla community di Joomla! per 272 voti su 527, il 52% 1.8 avrebbe continuato la numerazione attuale ma sarebbe stato contro la regola di identificare una versione x.5 come stabile e utilizzabile per anni, es. 1.5 2.5 continua a rispettare la regola precedente, ma passeremmo da 1.7 a 2.5 evitando la 2.0, indice di un rilascio Major
Il nuovo ciclo di rilascio di Joomla! Per rilascio di software si intende la distribuziome del codice, documentazione e materiale di supporto. La nuova strategia del progetto Joomla segue fortemente quella già utilizzata nel progetto Ubuntu, quindi nel progetto GNOME, nel quale i rilasci sono periodici nel tempo. Software stabile con supporto a lungo termine (LTS), 18 mesi Software di test con supporto a breve termine (STS), 6 mesi Ogni due rilasci STS c è un rilascio LTS
Ciclo di vita di un rilascio Il ciclo di vita di un rilascio di software è composto da distinte fasi e pietre miliari ( milestone ) che ne esprimono la maturità durante la sua evoluzione (pianificazione, sviluppo, rilascio, supporto) Non sempre si attraversano tutte le fasi, ad esempio i rilasci di tipo Maintenance saltano direttamente alla fase di rilascio, essendo presenti dei cambiamenti minimi
Software Milestone Il ciclo di vita Joomla! comprende quattro milestone Alpha Alto grado di sviluppo, continuo inserimento e rimozione di software Beta & Release Candidate, due milestone molto vicine Medio- basso grado di sviluppo, principalmente test di retrocompatibilità & stabilità, creazione di documentazione General Availability Software distribuito al pubblico, possibili rilasci Maintenance, inizio della fase di Supporto
Le fasi tra le Milestone Feature Merge: fase tra la milestone Alpha e la Beta & RC della nuova versione, circa 12 settimane Release Testing: fase tra la milestone Beta & RC e GA, circa 8 settimane Maintenance: fase tra GA e le 6 settimane successive Supporto: dalla fine della fase Maintenance al termine del supporto (LTS, STS) Il periodo di 18 mesi per LTS e di 6 mesi per STS comprendono la fase Maintenance e quella di Supporto
Milestone vs fasi Feature Merge Inclusione delle nuove feature nel ramo principale di sviluppo, che non rappresenta più il codice del rilascio corrente ma traccia il percorso per il nuovo rilascio.
Milestone vs fasi Feature Merge Release Testing Test del software, traduzione, documentazione Periodo utile a chi sviluppa estenzioni in modo da risolvere i problemi con la nuova versione prima del suo rilascio GA
Milestone vs fasi Feature Merge Release Testing Maintenance & Supporto Software disponibile al pubblico, i team sono impegnati a fixare i problemi che si presentano, nuova Feature Merge Solo rilasci di tipo Maintenance per problemi di sicurezza e stabilità, fino al termine del ciclo di vita della release
Le novità per gli utenti del CMS Le novità per gli utenti del CMS Joomla! sono Sito multilingua, senza JoomFish! Modulo di notifica automatica di aggiornamenti disponibili Miglioramenti a livelli di performance Un nuovo motore per la ricerca all interno del sito Finder Manipolazione delle immagini
Sito multilingua senza JoomFish! Con la nuova release 2.5 sarà possibile realizzare un sito multilingua senza installare il componente JoomFish! che rimane un progetto molto valido Sullo stile di JoomFish! per avere un sito multilingua si deve pubblicare il plugin Language Filter e il modulo Language Switcher, quindi pubblicare i contenuti tradotti assegnandoli alla relativa lingua
Finder Il Finder è un progetto che vuole migliorare lo strumento di ricerca presente in ogni sito Joomla! Si basa sul nuovo motore di ricerca implementato nel core di Joomla! Crea un indice delle parole contenute negli articoli Possibile ricerca per rilevanza Internazionalizzazione Usa algoritmi per il ranking dei risultati
Le novità per gli sviluppatori Le novità per chi sviluppa software per Joomla! sono molte e di vario tipo Suddivisione tra il CMS e la platform Introduzione delle eccezioni PHP e JException JRequest sarà rimpiazzata da JInput Il framework PHPUnit per testare il software prima di poter essere incluso in Joomla! JDatabase e i driver, non solo MySQL
CMS e platform C era una volta il file zip di Joomla! c è ancora, ma adesso il contenuto non è più relativo a un singolo progetto, è la fusione di due progetti: CMS e platform La platform è la base, si occupa della query request, dei database, degli eventi, degli errori e di molto altro; senza la platform non funzionerebbe nulla Il CMS, con i suoi componenti e moduli, che tutti utilizziamo per aggiungere articoli, voci di menù, gallerie di foto; la parte visibile di un sito web
Da dove nasce la platform La platform è una semplice cartella contenuta nel file zip che scaricate È l evoluzione della cartella libraries, da sempre presente all interno delle release Il rilascio stabile del progetto platform viene inserito all interno della cartella libraries
Perché è nata la platform Col tempo il software che costituiva Joomla! è cresciuto ed è diventato sempre più difficile gestire in maniera ottimale l intero prodotto Il dividi et impera vale ancora, soprattutto nel software La platform è stata quindi separata dal CMS Ciò da la possibilità di sviluppare applicazioni diverse dal CMS, che si basano comunque sulla platform (es. l installer Joomla!, il backend e il frontend, JCli attualmente in sviluppo)
Cosa cambia Prima Dopo CMS installer JCli Joomla! platform
La platform da Joomla! 1.6 Lo sviluppo su Joomla! 1.6 è radicalmente cambiato rispetto alla versione 1.5 La platform è stata riscritta seguendo il design pattern MVC: Model, View, Controller Chiunque voglia ora realizzare qualsiasi componente deve rispettare questo design pattern Per l attuale platform si richiede PHP 5.3, linguaggio ad oggetti
Le eccezioni Come ogni linguaggio ad oggetti che si rispetti, anche PHP implementa il meccanismo delle eccezioni Le eccezioni vengono alzate (throw) per segnalare casi di errore e DEVONO essere prese (catch) per gestirli Joomla utilizza la classe PHP Exception come classe base per derivare le classi di eccezioni specifiche (eg. JDatabaseException ) Questo meccanismo rimpiazza JLog.
Esempio di eccezione Il costruttore della mia classe JDatabasePostgreSQL controlla se è presente la funzione PHP pg_connect, se non esiste alza una eccezione if (! function_exists( 'pg_connect' ) ) { } throw new JDatabaseException(JText::_ ('JLIB_DATABASE_ERROR_ADAPTER_POSTGRESQL') );
Esempio di eccezione Il codice che circonda la costruzione di questa classe deve contenere un blocco try- catch per catturare l eccezione, se venisse sollevata dalla mancanza del driver PHP try { $postgreobj = new JDatabasePostgreSQL() ; } catch ( JDatabaseException ex ) { ex- >getmessage(); // segnalazione dell errore }
JRequest vs JInput L idea che sta dietro a JInput è quella di astrarre la sorgente di input per permettere al codice di essere riusato in differenti contesti e applicazioni Cambiare la sorgente di dati all interno di un componente vuol dire solamente estendere JInput per la nuova sorgente, senza dover riscrivere anche il controller e la view Ciò non limita l input alle sole variabili superglobali POST e GET
Il testing del software Un altro step importante nel processo di sviluppo software per Joomla! introdotto di recente è l uso di un framework di test per validare la correttezza del nuovo software Lo sviluppo di software è importante, ma è ancora più importante garantire che il nuovo codice non diminuisca la stabilità, la sicurezza e la manutenibilità del prodotto finale
Il testing del software I test utilizzano il codice implementato e ne verificano la correttezza evidenziando, nelle modifiche future, cosa queste ultime vanno a cambiare Per ogni funzione implementata dalla classe in sviluppo si crea una funzione che la testa Per lo sviluppo dei test su Joomla! si utilizza il framework PHPUnit
Testing con PHPUnit Il framework PHPUnit è responsabile dell esecuzione della sequenza di test, implementata separatamente dalla platform L esecuzione tipo di un test si divide in Creazione degli oggetti necessari Richiamo del singolo metodo da testare Verifica del corretto risultato durante l esecuzione e attraverso i log generati
Joomla! incontra PostgreSQL
I perché In questo ambiente in forte evoluzione, conoscendo la limitazione di Joomla! nell utilizzare soltanto MySQL e in vista della prossima release stabile 2.5, è nata la mia voglia di contribuire a questo progetto opensource sviluppando il driver per il database PostgreSQL
Cosa cambia Oltre al mio driver per PostgreSQL, sono in sviluppo driver per altri tipi di database: MSSQLSrv, SQLAzure L utente finale di un sito web, aziendale o amatoriale, non noterà nessuna differenza Il professionista che lavora realizzando siti web con Joomla! potrà vendere il proprio prodotto a molti più clienti e non sarà limitato a far usare sempre MySQL, potendo andare incontro alle richieste del cliente stesso se questo non può usare MySQL
Cos è PostgreSQL MySQL è un RDBMS opensource, Relational Database Managment System PostgreSQL è un ORDBMS opensource, Object- Relational Database Managment System Qualsiasi cosa è un oggetto: database, tabelle, tuple, viste, funzioni, sequenze, utenti... Ereditarietà tra gli oggetti Transazioni, forward key constraint, role
Lo sviluppo del driver L attuale platform fa molto uso di ereditarietà e polimorfismo, quindi di interfacce Ciò significa che mentre prima esisteva solo una classe per comunicare con un database MySQL, ora si utilizza una interfaccia database, senza conoscere qual è lo specifico database sottostante Si utilizzano sempre gli stessi metodi, cambia la traduzione nel linguaggio SQL proprio del database
Classe singola o interfaccia Uso di una classe singola Query sul database Uso di una interfaccia Query sul database Classe MySQL Interfaccia Database... Classe MySQL Classe PostgreSQL db MySQL db MySQL db PostgreSQL
Il driver La classe driver implementa ciò che l interfaccia astrae: i comandi sono tradotti nelle chiamate PHP corrette per il database in questione mysql_connect per MySQL, pg_connect per PostgreSQL Le variabili sono specifiche per il database MySQL quota con ` e, PostgreSQL solo con La data nulla per MySQL 0000-00- 00 00:00:00, per PostgreSQL è 1970-01- 01 00:00:00+00
Il driver Altre differenze più sostanziali riguardano le query tipiche di MySQL e le funzioni PHP di MySQL REPLACE INTO INSERT IGNORE INTO... ON DUPLICATE KEY... Supporto character set UTF8 mysql_insert_id() mysql_select_db()
Le query Altro grande problema di incompatibilità tra diversi tipi di database è la sintassi delle query che è possibile eseguire Anche per risolvere questo problema la strada seguita è quella di usare una interfaccia comune Si utilizzano gli stessi metodi per creare la query, che poi viene tradotta nella sintassi corretta
Esempio di query Una query può essere eseguita all interno di un componente semplicemente con $db- >setquery( SELECT * FROM # abc WHERE... ); $db- >query(); Potrebbe funzionare senza problemi, se si escludono le differenze appena citate
Esempio di query La stessa query, sicuramente più indipendente dal tipo di database, è $query = $db- >getquery( true ); $query- >select( * ) - >from( # abc ) - >where(... )... ; $db- >setquery( $query ); $db- >query(); Personalmente consiglio vivamente di usare questa procedura
I test Per poter inserire del codice nel progetto Joomla! si devono anche allegare i test relativi al codice, così da provare l effettivo funzionamento e la non regressione del resto del progetto Le sequenze di test che ho realizzato sono relative, ovviamente, al driver e alla classe che gestisce le query
Esempio di test $query = $this- >object- >getquery(true); $query- >select( '* ); $query- >from( 'jos_dbtest ); $query- >where( 'description=. $this- >object- >quote( 'one ) ); $this- >object- >setquery( $query ); $res = $this- >object- >query(); $this- >assertthat( $this- >object- >getnumrows( $res ), $this- >equalto( 2 ), LINE );
Q&A