Sei qui: Homefreccia in avantiTYPO3freccia in avantiSviluppo estensioni per TYPO3

LE ESTENSIONI PER TYPO3: REALIZZAZIONE DI UN PLUGIN D’ESEMPIO

TYPO3 è un sistema estremamente modulare basato sulle estensioni. In questo articolo inizieremo lo sviluppo di un plugin custom per TYPO3.

Articoli, tutorial e news sul CMS TYPO3

Sviluppo plugin di FE in TYPO3
Sviluppo estensioni per TYPO3
Integrare template custom
Gestione utenti di BE

Introduzione

Dopo aver introdotto la gestione degli utenti di BE in TYPO3 e la creazione di template personalizzati per TYPO3, in questo articolo e nel prossimo ci avvicineremo al mondo delle estensioni di TYPO3. Negli articoli precedenti abbiamo definito TYPO3 come un CMS, in realtà TYPO3 è molto di più e può essere definito come un framework per applicazioni web. Questo framework può essere espanso, modificato o integrato mediate le estensioni (basti pensare che le funzionalità di CMS sono anch'esse racchiuse in un'estensione). Una delle caratteristiche principali di questo framework è infatti la sua espandibilità mediante quelle che vengono chiamate estensioni, ovvero dei plugin che apportano nuove funzionalità o modificano quelle disponibili. In questo primo articolo inizieremo quindi con introdurre più precisamente cosa sono e come vengono gestite le estensioni in TYPO3, per poi passare alla realizzazione di una semplice estensione d'esempio, un guestbook, mediante un ottimo strumento di wizard fornito come estensione, appunto, di TYPO3. Nel prossimo articolo concluderemo l'estensione qui iniziata creando il codice necessario per la visualizzazione da Front-End (FE) dei messaggi del guestbook.

Le estensioni di TYPO3

Come detto sopra, le estensioni svolgono un ruolo cruciale in TYPO3 in quanto sono la maggior fonte di nuove funzionalità per il sistema. Gli sviluppatori di estensioni sono sia web agency e software house sia semplici appassionati appartenenti alla vastissima comunità di TYPO3. Sul sito di riferimento degli sviluppatori [6] è presente quello che viene chiamato Extension Repository, un archivio di tutte le estensioni sviluppate e rese pubbliche dai rispettivi autori (sono presenti più di 3000 estensioni, dal semplice guestbook a estensioni per l’accesso via LDAP o per il commercio elettronico). Tali estensioni possono essere installate semplicemente mediante l’Extension Manager, un modulo apposito presente nel Back-End (BE) di TYPO3. Questo modulo consente di scaricare le estensioni presenti nel repository (o di caricarne direttamente dal file system locale), di installarle ed eventualmente disinstallarle, il tutto nella massima semplicità. L’ultimo componente necessario per la gestione delle estensioni sono le interfacce presenti per permettere la connessione e l’integrazione delle estensioni al core di TYPO3 (interfacce denominate Extension API).

In TYPO3 le estensioni possono essere installate su tre livelli diversi: a livello di sistema, a livello globale o a livello locale. Le estensioni di sistema sono quelle estensioni che servono a TYPO3 stesso per poter funzionare. Mediante l’Extension Manager non è possibile installare estensioni a livello di sistema. Per poter spiegare, invece, la differenza fra estensioni globali e estensioni locali è necessario un breve preambolo. Durante l’installazione del sistema TYPO3 è possibile optare per due diverse strade: la prima è quella di fare un’installazione separata per ogni sito, la seconda è quella di effettuare un’installazione ridotta per ogni sito (installazione che conterrà solamente la configurazione personalizzata per ognuno) e far condividere i sorgenti del framework. Seguendo la seconda strada si hanno diversi vantaggi: l’aggiornamento di TYPO3 va effettuato solamente una volta in quanto è sufficiente aggiornare i sorgenti condivisi, la gestione dei permessi è più semplice poichè concentrata in un unico punto e infine lo spazio occupato su disco è inferiore. Detto questo ritorniamo alla differenza fra estensioni globali e locali. Le estensioni globali sono estensioni che vengono installate allo stesso livello dei sorgenti di TYPO3 mentre le estensioni locali sono installate come personalizzazioni del singolo sito web. Come si può intuire, seguendo la prima strada sopra definita, questa differenza non ha alcun effetto. Seguendo invece la seconda strada risulta evedente come un’estensione globale sia a disposizione di tutti i siti che condividono i sorgenti, mentre un’estensione locale è disponibile solo per la singola istanza che l’ha installata. Risulta quindi molto importante il concetto di precedenza: un’estensione locale ha precedenza sulla stessa estensione globale. Questa caratteristica risulta determinante nel caso sia necessario personalizzare un’estensione. Supponiamo per esempio di installare un’estensione a livello globale in quanto utilizzata in gran parte dei nostri siti. Se avessimo bisogno di personalizzarla per un singolo sito non potremmo procedere a livello globale altrimenti verrebbe modificato il funzionamento anche per tutti gli altri siti. In casi come questo è sufficiente procedere ad un’installazione locale e apportare le modifiche solamente a questa.

Parlando di estensioni, un concetto fondamentale è quello di extension key, ovvero di chiave dell’estensione. Ogni estensione è individuata in modo univoco da una stringa, la chiave appunto, che ne definisce il nome della directory di installazione, il nome della classe principale e il prefisso per tutte le tabelle create nel database e per tutti i campi aggiunti alle tabelle già presenti. Attraverso questa chiave univoca TYPO3 è in grado di minimizzare i conflitti all’interno del sistema.

Ci sarebbero molti altri aspetti degni di nota riguardo le estensioni ma per il momento concludiamo questa introduzione definendo quelle che sono le categorie in cui si possono raggruppare:

Da notare come un’estensione possa appartenere a più di una categoria.

L'estensione guestbook

Come già anticipato, in questo articolo realizzeremo una semplice estensione dimostrativa. L’estensione in questione è un guestbook e può quindi essere catalogato come un Front-end Plugin in quanto aggiunge nuove funzionalità (la form di inserimento commenti) e nuove visualizzazioni (la lista dei commenti) al FE. Realizzeremo una tabella nel database per contenere i commenti (ci sarà un campo per il nome dell’autore e uno per il commento) e quindi il codice necessario per la visualizzazione di questi dati da FE.

Il wizard Kickstarter

La nuova opzione disponibile dopo l’installazione del Kickstarter
Figura 1
L’interfaccia iniziale del wizard
Figura 2
Creazione di una nuova tabella nel DB
Figura 3
Come impostare il campo dell’autore
Figura 4
Come impostare il campo del messaggio
Figura 5
Impostare correttamente il Front-end Plugin
Figura 6

Lo sviluppo di una nuova estensione per TYPO3 può avvenire “manualmente”, ovvero creando tutti i file necessari con le dovute strutture dati, oppure può essere agevolato mediante l’utilizzo di un wizard che consente di definire le proprietà che dovrà avere la nostra estensione (tabelle e campi nel db, plugin di FE, moduli di BE e molto altro) e che si occupa di creare i relativi file e le relative strutture dati. Tale wizard è disponibile, guarda caso, come estensione di TYPO3 e può essere facilmente installato. Il nome del wizard è Kickstarter.

Per iniziare la realizzazione della nostra estensione dobbiamo quindi installare il Kickstarter mediante l’Extension Manager. Dopo l’installazione comparirà una nuova voce di menu tra quelle disponibili nell’Extension Manager, tale voce consentirà di iniziare lo sviluppo di una nuova estensione (si veda la Figura 1).

Selezionando quindi la nuova voce “Make new extension” viene avviato il wizard (Figura 2). La prima operazione da fare è quella di determinare una extension key, ovvero una stringa formata dai caratteri a-z, 0-9, _. Si possono distinguere due casi: le estensioni specifiche per un progetto e le estensioni di utilità comune e che quindi saranno rilasciate. Nel primo caso la chiave dell’estensione, per convenzione, inizierà col prefisso user_. Nel caso di estensioni che verranno inserite nel repository pubblico la chiave dovrà essere registrata attraverso il sito [6], al fine di essere certi della sua univocità e non potrà iniziare col prefisso visto sopra. Nel nostro caso possiamo definire la chiave user_guestbook.

A questo punto possiamo passare a definire le informazioni generali della nostra estensione quali il titolo, una breve descrizione, la categoria (nel nostro caso Front-end Plugin), stato (possiamo settare lo stato di “Test”), dipendenze da altre estensioni, autore e mail dell’autore.

Subito dopo è conveniente passare all’ultima delle opzioni disponibili: quella riguardante la localizzazione dell’estensione. Dobbiamo infatti attivare anche la lingua italiana oltre a quella inglese di default. Per far questo è sufficiente cliccare sul pulsante “+” che compare a fianco della voce “Setup languages” e, nella form che compare, spuntare la lingua italiana.

Passiamo ora a definire la tabella necessaria per contenere i messaggi lasciati dai visitatori. Sempre con il pulsante “+” aggiungiamo una nuova tabella nel database e completiamo il nome che dovrà avere (come potete vedere in Figura 3 il nome della tabella avrà come prefisso user_guestbook_, ovvero la chiave dell’estensione). Di seguito diamo anche un titolo alla tabella, sia in lingua inglese che in lingua italiana. Tale titolo costituirà il nome della tipologia di record contenuti in questa tabella.

A questo punto possiamo passare a definire di quali campi sarà composta questa tabella. Scorrendo la form possiamo selezionare alcuni campi già disponibili, come il campo deleted e il campo hidden. Il primo serve ad evitare che un record cancellato venga completamente rimosso dalla tabella (verrà invece settato un flag che permetterà a TYPO3 di ignorare il record e a noi di recuperarlo nel caso di una cancellazione errata). Il secondo invece permetterà di nascondere un record dalla sua presentazione a FE. Gli altri campi proposti sono i campi necessari per settare un inizio e una fine di validità del record e un campo per settare una restrizione dell’accesso ai soli utenti loggati. Nessuno di questi tre campi è richiesto nel nostro caso.

Continuando a scendere troviamo numerose opzioni che per la nostra estensione non sono richieste ma che, se vi interessano per altri progetti, trovate commentate nelle letture proposte in bibliografia. Per il nostro scopo sarà sufficiente settare l’opzione “Descending” per l’ordinamento (in questo modo i messaggi saranno automaticamente ordinati dal più recente al meno recente) e l’opzione “Allowed on pages” per permettere la creazione dei messaggi in normali pagine nel BE.

Non ci resta che definire i campi specifici per la nostra estensione. Il primo di questi sarà un campo dove l’utente dovrà inserire il proprio nome. In Figura 4 vediamo come dovrà essere impostato questo campo. Il secondo sarà un campo in cui l’utente potrà inserire il messaggio (Figura 5). Questi due campi si differenziano principalmente per il tipo di input che possono accettare. Nel primo caso l’input sarà costituito da una stringa semplice, di lunghezza massima di 50 caratteri, e sarà obbligatorio. Nel secondo caso sarà un testo e l’utente (di BE) avrà a disposizione un editor WYSIWYG per scriverlo. I tipi di input possibili sono molteplici:

  • Stringa semplice;

  • Stringa evoluta per la creazione di campi password, numerici, di data, di colori, di link e altro;

  • Textarea con o senza editor WYSIWYG;

  • Checkbox;

  • Link;

  • Date;

  • Selectorbox;

  • Radio buttons;

  • Database relations, con la possibilità di specificare la tabella con cui è possibile effettuare la relazione;

  • Files, con relativo modulo di upload;

  • Non editabili, campi solo visualizzati;

  • Passthrough, campi nascosti.

Il wizard non si occuperà solamente di creare i campi nel database ma, come vedremo, creerà anche la necessaria struttura dati per permettere a TYPO3 di generare la form per l’inserimento di tali dati dal BE.

Nei due campi precedenti, però, vorrei farvi notare un’ulteriore differenza: il campo del messaggio è impostato come “Exclude field” mentre il primo non lo è. Un campo “escludibile” è un campo che è possibile nascondere ad un utente di BE non admin. In questo caso è possibile nascondere il campo del messaggio mentre non è possibile nascondere il campo dell’autore in quanto obbligatorio e, quindi, se un utente non potesse accedervi, non sarebbe in grado di creare dei record di questo tipo.

Per la nostra estensione non rimane che impostare correttamente il Front-end Plugin. È quindi necessario creare un nuovo Front-end Plugin, dare un titolo e selezionare entrambe le opzioni. La prima serve per dire a TYPO3 che i contenuti generati da questo plugin non dovranno essere messi in cache, il secondo serve per importare automaticamente il codice TypoScript di configurazione dell’estensione, qualora presente. Al momento non definiremo alcun codice Typoscript ma, quando creeremo la logica dell’estensione, introdurremo anche questo livello di personalizzazione. A seguire selezioniamo la prima voce e impostiamo i valori come in Figura 6.

A questo punto siamo pronti per salvare la nostra estensione. Sulla sinistra si può trovare il pulsante “View result”. Una volta premuto, il wizard ci mostra tutti i file che andrà a creare e il loro contenuto. Qui è possibile anche evitare di scrivere dei file. Questa possibilità è molto importante nel caso si stia modificando un’estensione precedentemente creata mediante questo wizard. Se infatti abbiamo apportato delle modifiche manuali ai file, tipico il caso del file contenente la logica per la visualizzazione dell’estensione da FE, e lasciando selezionato questo file il wizard lo sovrascriverà causando la perdita di tutte le nostre modifiche. Passiamo quindi alla generazione dei file semplicemente cliccando sul pulsante “write”.

Le funzionalità gia disponibili

La form di BE per la creazione di messaggi
Figura 7

Una volta salvata l’estensione sarà già possibile installarla, come una qualsiasi altra estensione. Durante l’installazione verrà automaticamente creata la tabella nel database e una cartella sul server per il salvataggio di eventuali immagini caricate attraverso l’editor di testo. Dopo l’installazione sarà già possibile includere il plugin in una pagina come un qualsiasi altro contenuto di pagina. L’output generato da FE, ovviamente, sarà solamente un output d’esempio. Nel prossimo articolo andremo a scrivere il codice necessario alla visualizzazione della lista dei messaggi e della form per il loro inserimento.

Nel frattempo, però, gli utenti di BE possono già inserire dei messaggi attraverso il modulo generato automaticamente da TYPO3. Per creare messaggi per il guestbook è sufficiente andare nella pagina contenente il nostro plugin, cliccare su “Create new record” e selezionare un nuovo “Visitor’s Message”, se lavoriamo in lingua inglese, o un nuovo “Messaggi dei Visitatori”, se lavoriamo in lingua italiana. Come possiamo vedere in Figura 7, la form generata contiene esattamente i campi da noi specificati in precedenza.

Se ora passiamo a vedere la tabella generata, direttamente nel database, mediante phpmyadmin o uno strumento simile, però, ci accorgiamo che ci sono numerosi altri campi oltre a quelli da noi specificati. Tali campi sono l’uid, un identificatore univoco del record, il pid, ovvero l’uid della pagina che contiene questo record, il tstamp, un timestamp riportante la data di ultima modifica del record, il crdate, il timestamp di creazione del record, e il cruser_id, ovvero l’uid dell’utente di BE che ha creato questo record. Tali campi vengono generati automaticamente e sono necessari al corretto funzionamento di TYPO3 e di questa estensione.

I file generati dal Kickstarter

Il wizard per la selezione del plugin
Figura 8

In ultimo vediamo quali file sono stati generati dal Kickstarter. Elencando i file presenti nella radice della nostra estensione, il primo che incontriamo è il file ext_emconf.php. Questo file contiene le informazioni generali dell’estensione, dal titolo all’autore, inoltre contiene delle informazioni relative alla versione dell’estensione (gestite automaticamente al momento dell’upload nel repository pubblico) e dei file contenuti nell’estensione (ad ogni file è associato un codice md5 per poter risalire ai quelli modificati). Il file ext_localconf.php contiene la configurazione necessaria per integrare l’estensione nel framework mentre il file ext_tables.php contiene le configurazioni necessarie ad integrare le tabelle nel database, i plugin di FE e i moduli di BE. Il file ext_tables.sql contiene invece il codice SQL per la generazione delle tabelle nel database. Il file ext_typoscript_editorcfg.txt contiene del codice TypoScript che viene integrato. I file locallang.xml e locallang_db.xml contengono i testi in diverse lingue per la localizzazione del plugin e di tutti i campi del database. Infine il file tca.php contiene la struttura dati che permette a TYPO3 di generare correttamente la form per l’inserimento dei messaggi da BE. Di seguito è presente un estratto di tale file dove è possibile notare come viene descritto il campo per l’inserimento del nome dell’autore:

"nome" => Array (

"exclude" => 0,

"label" => “LLL:EXT:user_guestbook/locallang_db.xml:user_guestbook_messaggi.nome",

"config" => Array (

"type" => "input",

"size" => "30",

"max" => "50",

"eval" => "required",

)

),

Per ogni campo della form sarà presente una descrizione simile. Questa struttura dati è facilmente modificabile per aggiungere nuovi campi (in questi casi bisogna ricordarsi però di aggiornare anche il file ext_tables.sql) o di modificare il comportamento di un campo (in questo esempio si potrebbe togliere l’obbligatorietà del campo rimuovendo la riga “eval”=>”required”).

Nella cartella doc/ si trovano due file che sono inutili per l’estensione ma necessari al kickstarter per poter ricreare il wizard con i giusti parametri nel caso si cerchi di modificare l’estensione attraverso di esso. A questo punto dovrebbe essere chiaro come le modifiche apportate manualmente ad uno qualsiasi dei file dell’estensione non vengano presentate aggiornate dal kickstarter. Questi due file possono essere liberamente cancellati prima della pubblicazione dell’estensione (il mio consiglio comunque è di cancellarli non appena viene apportata una modifica ad uno dei file visti sopra per evitare di utilizzare il wizard per eventuali nuove modifiche rischiando di perdere quelle fatte manualmente). In questa cartella dovrà essere inserito il manuale dell’estensione.

Infine, nella cartella pi1/ troviamo i file necessari al funzionamento del Front-end Plugin (se avessimo attivato più plugin avremmo avuto anche le cartelle pi2/, pi3/ e così via). Il file principale è il file class.user_guestbook_pi1.php che viene richiamato da TYPO3 nel caso debba presentare a FE il nostro plugin e che pertanto deve generare l’output voluto. Se provate ad editarlo noterete come genera l’output d’esempio. Il file class.user_guestbook_pi1_wizicon.php contiene delle istruzioni necessarie a TYPO3 per presentare il nostro plugin nella lista di quelli disponibili durante la creazione di un nuovo elemento di contenuto (Figura 8). Il file locallang.xml è il file che dovrà contenere tutti i testi visualizzati a FE dall’estensione nelle varie lingue attivate.

Conclusioni

In questo articolo abbiamo aperto la porta delle estensioni di TYPO3. Come abbiamo visto, TYPO3 è un framework fortemente basato sulle estensioni. Nell’esempio sopra riportato abbiamo sfruttato il wizard Kickstarter per iniziare la creazione di una semplicissima estensione per la gestione di un guestbook. Grazie a questo wizard, senza neppure scrivere una riga di codice, siamo riusciti a creare tutta la parte di BE necessaria all’estensione. Nel prossimo articolo ci occuperemo della presentazione da FE dei messaggi e della form di inserimento di nuovi messaggi, lavorando nella cartella pi1/.

Bibliografia

[1] W. Altmann, R. Fritz, D. Hinderink, “TYPO3, Enterprise Content Management”, 2005 Packt Publishing, Birmingham (UK).

[2] Kasper Skårhøj, “Backend Programming”, http://typo3.org/documentation/document-library/tutorials/doc_tut_backend/current/view/

[3] Kasper Skårhøj, “TYPO3 Coding Guidelines”, http://typo3.org/documentation/document-library/core-documentation/doc_core_cgl/current/view/

[4] Kasper Skårhøj, “TYPO3 Core APIs”, http://typo3.org/documentation/document-library/core-documentation/doc_core_api/current/view/

[5] Oliver Hofmann, “Basic extension tutorial”, http://typo3.org/documentation/document-library/tutorials/player_profile_basic/current/view/

[6] Il sito di riferimento degli sviluppatori: http://www.typo3.org

Commenti all'articolo

Nessun elemento
Nessun elemento trovato nel Guestbook