Joomlashow arrow Guide arrow Creare un plugin per Joomla 1.5

Creare un plugin per Joomla 1.5

21-02-2009 22:37

scritto da Federico Capoano

In questo articolo vedremo come sviluppare un plugin per Joomla 1.5.

Come risultato avremo un plugin molto semplice, infatti l'articolo non si propone come obiettivo quello di svlippuarne uno complesso, ma di illustrare a chi si sta avvicinando da poco al core di Joomla le basi della creazione di plugin.

Che cos'è un plugin e a cosa serve?

Gestione Plugin di Joomla 1.5

Nel framework di Joomla 1.5 per plugin si intende una parte di codice che viene eseguita in un determinato momento del caricamento della pagina o ad una determinata azione dell'utente

La possibilità di eseguire del codice in un determinato momento, a seconda che certe condizioni si verifichino o meno, ci da la possibilità di estendere le funzionalità di Joomla, aggiungendo caratteristiche e operazioni che ci aiutano a risolvere determinati problemi, come ad esempio migliorare l'usabilità del sito aggiungendo delle informazioni ai contenuti, ma anche operazioni più complesse come migliorare le performance, effettuare il caching o un backup del database.

L'unico limite a questa estensibilità sono la nostra fantasia, la nostra abilità nella programmazione con PHP e della conoscenza di Joomla.

Possiamo osservare i plugin installati di default in Joomla andando in "Estensioni" > "Gestione Plugin" nel backend del nostro sito Joomla

Potenza e pericolosità di un plugin

Un plugin è uno strumento che può essere molto potente ed utile per il nostro sito Joomla.

Proprio per questo motivo dobbiamo essere cauti non solo nel realizzarne uno ma anche nell'utilizzare quelli che sono installati sul nostro sito:
un plugin che non viene scritto tenendo a mente le performance e/o peggio ancora bypassando il framework di Joomla può essere dannoso e/o rischioso per un sito Joomla.

Esaminiamo i due possibili problemi principali:

Perdita di performance

Se un plugin effettua molte query in modo inefficiente al database o esegue cicli molto lunghi utilizzando funzioni di PHP che consumano molte risorse il risultato potrebbe rallentare sensibilmente il caricamento del sito.

Se un plugin con dei difetti come quelli appena descritti venisse eseguito ad ogni caricamento di pagina in un sito ospitato su un'hosting condiviso, come ad esempio Aruba, lo stress potrebbe ripercuotesi su tutti i siti ospitati sullo stesso server e in alcuni casi questo potrebbe risultare in un interruzione del servizio nei confronti del sito che ospita lo script difettato.

Problemi di sicurezza e compatibilità

Un plugin che contiene codice non conforme al framework di Joomla rischia di compromettere la sicurezza del nostro sito, per spiegare questo aspetto molto importante farò un esempio abbastanza elementare:

Se un programmatore con poca esperienza dovesse recuperare il contenuto di una variabile nella query string con PHP e quindi volesse visualizzarla nella pagina probabilmente utilizzerebbe un codice del genere:

 
<?php $variabile = $_GET["variabile"]; ?>
<p>La variabile nella query string &egrave; <?=$variabile ?></p>
 

Questo codice contiene una falla di sicurezza e un possibile problema di compatibilità:

Una variabile proveniente dall'esterno va sempre controllata e filtrata prima di essere eseguita o visualizzata. Non farlo significherebbe aprire delle falle in cui un attaccante potrebbe divertirsi a provare gli attacchi che vengono effettuati più comunemente sul web: SQL Injection, Php Injection ed Cross Site scripting per esempio.

Inoltre gli short-hand tags possono costituire un problema di compatibilità sui server che utilizzano molti linguaggi di programmazione e che quindi li disabilitano per evitare ambiguità con gli altri linguaggi.

Il framework di Joomla fornisce delle classi, metodi e funzioni che risolvono tutti i problemi di routine della programmazione di applicazioni in PHP e sconsiglia vivamente l'uso di short hand tags.

Riscriviamo quindi il codice scritto poco fa integrandolo in Joomla evitando così problemi di sicurezza e compatiblità:

 
<?php $variabile = JRequest::getString( "variabile", NULL ); ?>
<p>La variabile nella query string &egrave; <?php echo $variabile ?>
 

Questo codice fa uso del metodo statico getString della classe JRequest del framework di Joomla, che ci permette di recuperare il contenuto di una variabile nell'array superglobale $_REQUEST (che contiene a sua volta anche $_GET, $_POST e $_COOKIE). Questo metodo controlla ed elimina eventuale codice HTML o PHP contenuto nella variabile e restituisce il contenuto ripulito.

Noterete anche che la variabile viene stampata sullo schermo utilizzando

 
<?php echo $variabile ?>
 

invece che il vecchio

 
<?=$variabile ?>
 

Questo permetterà al nostro script di essere eseguito su tutti i server e di non causare problemi di compatibilità. Inoltre dal mio punto di vista seguendo questa convenzione si riesce a scrivere un codice più leggibile.

La classe JRequest contiene altri metodi utili per recuperare variabili dall'array superglobale $_REQUEST e per prevenire possibili attacchi, per approfondire l'argomento vi consiglio la lettura dell'articolo Preventing SQL Injections.

Tipologie di Plugin

Joomla viene distribuito con certo numero di tipologie di plugin definite core.
Queste tipologe sono raggruppate nella cartella /plugins/ di ogni installazione Joomla e sono le seguenti:

  • authentication: per estendere l'autenticazione
  • content: per effettuare controlli o inserire funzionalità nei contenuti
  • editors: per realizzare editor
  • editors-xtd: per le estensioni degli editor
  • search: per estendere le funzionalità di ricerca
  • system: per far eseguire codice in vari momenti del caricamento del framework
  • user: per estendere le funzionalità degli utenti
  • xmlrpc: per estendere l'interattività con altri servizi web (ad es:Desktop remoti)

Ogni tipologia di plugin serve a svolgere delle funzionalità diverse.
I plugin della tipologia "authentication" (autenticazione) svolgeranno sicuramente delle operazioni molto diverse da quelli della tiplogia "search" (ricerca): per permettere ciò Joomla mette a disposizione a ciascuna tipologia di plugin una serie di eventi. Gli eventi nono sono altro che diversi momenti o appunto eventi che si susseguono nel caricamento del framework di Joomla. È possibile quindi eseguire del codice in ognuno degli eventi che Joomla mette a disposizione per una determinata tipologia di plugin.

Le tipologie sono estensibili, ciò significa che qualora se ne presentasse la necessità sarebbe possibile creare una nuova tipologia di plugin. Solitamente questo accade quando si sviluppa un componente che ha degli eventi personalizzati e che ha bisogno di effettuare certe operazioni all'esecuzione di questi eventi.

Eventi a disposizione per ogni tipologia di plugin

Authentication:

  • onAuthenticate

Content:

  • onPrepareContent
  • onAfterDisplayTitle
  • onBeforeDisplayContent
  • onBeforeContentSave (aggiunto nella versione 1.5.4)
  • onAfterContentSave (aggiunto nella versione 1.5.4)

Editors:

  • onInit
  • onGetContent
  • onSetContent
  • onSave
  • onDisplay
  • onGetInsertMethod

Editors XTD (Extended):

  • onDisplay

Search:

  • onSearch
  • onSearchAreas

System:

  • onAfterInitialise
  • onAfterRoute
  • onAfterDispatch
  • onAfterRender

User:

  • onLoginUser
  • onLoginFailure
  • onLogoutUser
  • onLogoutFailure
  • onBeforeStoreUser
  • onAfterStoreUser
  • onBeforeDeleteUser
  • onAfterDeleteUser

XML-RPC:

  • onGetWebServices

Sviluppiamo finalmente il nostro plugin: "Aboutme"

Dopo questa lunga (ma importante) panoramica sui plugin possiamo finalmente iniziare a sviluppare un semplice plugin della tipologia "content" che ci aiuterà a inserire qualche informazione su di noi ogni volta che inseriremo la stringa {aboutme} in un contenuto di Joomla.

Files necessari

Il numero di files minimi necessari per la creazione di un plugin sono due:

  • aboutme.php
  • aboutme.xml
Nel nostro caso ci limiteremo a questi due soli files. Nel caso avessimo avuto bisogno di più files avremmo potuto creare una cartella "aboutme/" in cui collocare gli altri files (che potrebbero essere files php, immagini o javascript), specificando la cartella aggiuntiva nel file aboutme.xml.

aboutme.php

Nel file aboutme.php inseriremo il codice che verrà eseguito all'evento "onPrepareContent", ossia prima che il contenuto di un articolo (o di un modulo) venga stampato. Questo ci permetterà di trovare eventuali occorrenze della stringa {aboutme} e di sostiturila con del codice html che da qualche breve informazione a proposito di noi.

Queste brevi informazioni inserite da noi stessi saranno gestibili dal pannello di controllo del plugin.

Inoltre potremo scegliere la classe css da applicare al testo mentre nei "parametri avanzati" avremo la possibilità di decidere quale tag utilizzare (tra blockquote, p e div) per contenere il testo e se effettuare l'escape con la funzione HTML entities di php oppure no.

 
<?php
/**
* @version 1.0
* @name About Me
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* Plugin per Joomla 1.5 che inserisce alcune informazioni ad ogni occorrenza della stringa {aboutme}
* Per maggiori informazioni visitare http://www.joomlashow.it/guide/sviluppo-estensioni/creare-un-plugin-per-joomla-1.5/
*/
 
// impediamo l'accesso diretto allo script
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport( 'joomla.plugin.plugin' );
 
// Creiamo una la classe del nostro plugin estendendo la classe Jplugin ed ereditando tutti i suoi metodi
class plgContentAboutme extends JPlugin
{
 
  /**
   * Costruttore
   * Chiamiamo il costruttore della classe genitrice per inizializzare il plugin
   */
  function plgContentAboutme( &$subject, $params )
  {
    parent::__construct( $subject, $params );
  }
 
  /**
   * Aboutme prepare content method
   *
   * Questo metodo viene chiamato da Joomla prima che il contenuto viene visualizzato
   *
   * @param   oggetto contenente l'articolo    The article object.  Note $article->text is also available
   * @param   oggetto contenente i parametri del plugin
   * @limitstart   il numero di pagina, a noi questo non interessa qui
   */
  function onPrepareContent( &$article, &$params, $limitstart )
  {
    global $mainframe;
 
        // Se il plugin è attivato e se viene trovata la stringa {aboutme} all'interno del contenuto
      if ($this->params->get( 'enabled', 1 ) && strripos($article->text, "{aboutme}") !== false) {
 
            // Recupero il testo da inserire
            $about_text = $this->params->get('about_text', NULL);
 
            // Controllo HTML
            if(intval($this->params->get('htmlentities', NULL)) == 1) $about_text = htmlentities($about_text, ENT_QUOTES);
 
            // Recupero il tag selezionato
            $tag = $this->params->get('tag', 'blockquote');
 
            // Recupero la classe css
            $class = $this->params->get('css_class', NULL);
            // Se la classe è vuota non ho bisogno di inserire l'attributo class
            $output = ($class != '') ? ' class="'. $class .'"' : "" ;
 
            // Inserisco il testo dentro il tag con la relativa classe
            $about_text = '<' . $tag . $output .'>' . $about_text . '</' . $tag . '>';
 
            // Rimuovo eventuale tag <p> inserito automaticamente dall'editor
            $article->text = str_replace("<p>{aboutme}</p>", "{aboutme}", $article->text);
 
            // Effettuo la sostituzione finale
            $article->text = str_replace("{aboutme}", $about_text, $article->text);
 
            return true;
      }
      else return false;
  }
}
 

Anche se i commenti nel codice sono abbastanza espliciti, è necessario fare delle precisazioni:

per convenzione il nome della classe deve essere: plg + Tipologia plugin (prima lettera maiuscola) + Nome plugin (prima lettera maiuscola), quindi nel nostro caso plgContentAboutme.

La prima funzione della classe è il costruttore che per retrocompatibilità con php4 deve avere lo stesso nome della classe. Se avessimo voluto scrivere un plugin non retrocompatibile e quindi disegnato per php 5 (o superiore) avremmo potuto semplicemente utilizzare "__constructor"

In questo caso il costruttore è stato inserito solo come esempio teorico: noterete infatti che non esegue nessuna operazione e può essere cancellato.
Se avessimo voluto effettuare alcune operazioni anche nel caso la stringa {aboutme} non fosse stata trovata avremmo potuto inserire le istruzioni nella funzione costruttore ed in quel caso il codice sarebbe stato eseguito ad ogni caricamento della pagina (tenere sempre a mente ciò che si è detto a proposito delle performance).

Avremmo potuto utilizzare anche un tipo di programmazione procedurale evitando di scrivere una classe, ma dato che gli sviluppatori del framework di Joomla raccomandano di seguire questo paradigma è bene seguire il loro consiglio. Inoltre giocare con questo tipo di codice ci abitua al design strutturato a oggetti di tutte le moderne applicazioni web (e non solo web).

aboutme.xml

Il file aboutme.xml è necessario per l'installazione del plugin e per la gestione dei parametri.

 
<?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="plugin" group="content">
  <name>About Me</name>
  <author>Federico Capoano</author>
  <creationDate>February 2009</creationDate>
  <license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license>
  <authorEmail>info[chiocciola]joomlashow.it</authorEmail>
  <authorUrl>www.joomlashow.it</authorUrl>
  <version>1</version>
  <description>Visualizza dele informazioni ad ogni occorrenza della stringa {aboutme}</description>
    <files>
        <filename plugin="aboutme">aboutme.php</filename>
    </files>
    <params>
        <param name="about_text" type="textarea" rows="8" cols="35" default="" label="Testo" description="Scrivi le informazioni che verranno aggiunte al posto della stringa {aboutme}." />
        <param name="css_class" type="text" default="" label="Classe CSS" description="Specifica una classe CSS per il tag contenitore." />
    </params>
    <params group="advanced">
        <param name="tag" type="list" default="1" label="Tag contenitore" description="In quale tag vuoi racchiudere il tuo testo">
            <option value="blockquote">Blockquote</option>
            <option value="p">Paragrafo</option>
            <option value="div">Div</option>
        </param>
        <param name="htmlentities" type="radio" default="0" label="Escape HTML" description="Specifica se vuoi che il testo inserito venga processato con la funzione htmlentities di PHP">
            <option value="0">Disattivato</option>
            <option value="1">Attivato</option>
        </param>
    </params>
</install>
 

Spiegherò brevemente il significato generale dei tags:

  • <install version="1.5" type="plugin" group="content"> questo tag indica all'installer di joomla 1.5 che il pacchetto è un plugin della tipologia "content"
  • <name>: nome del plugin
  • <author>: nome dell'autore del plugin
  • <creationDate>: data creazione del plugin, appare nel backend
  • <license>: licenza con cui viene distribuito il plugin, tag opzionale
  • <authorEmail>: data creazione del plugin, appare nel backend
  • <authorUrl>: sito dell'autore, appare nel backend
  • <version>: versione del plugin, appare nel backend
  • <description>: descrizione del plugin, appare al momento dell'installazione
  • <files>: contiene altri tag che definiscono i files del plugin, serve all'installer di Joomla
  • <filename plugin="aboutme">aboutme.php</filename>: indica che il file php del plugin è aboutme.php
  • <params>, <params group="advanced">: parametri del plugin
Se avessimo avuto bisogno di una cartella contenente altri files avremmo dovuto specificare i files nella sezione <files> dell'xml:
 
<files>
    <filename plugin="aboutme">aboutme.php</filename>
    <filename>aboutme/aboutme.css</filename>
    <filename>aboutme/aboutme.js</filename>
</files>
 

Parametri del plugin

Per aggiungere dei paramtri al modulo basta inserire dei tag <param> all'interno dei gruppi <params> o <params group="advanced">

Generalmente nel gruppo dei parametri avanzati si inseriscono i parametri che potrebbero confondere o spaventare gli utenti meno esperti. Questi parametri infatti vengono visualizzati solamente dopo il click sulla scritta "Parametri avanzati".

Parametri plugin & Parametri Avanzati

Un parametro è strutturato solitamente nel seguente modo:

 
<param
    name="nomeparametro"
    type="text"
    default="testo di default"
    label="Nome visualizzato nel backend"
    description="Descrizione che appare nel tooltip."
/>
 

Può essere strutturato in quest'altro modo se contiene delle opzioni:

 
<param name="nomeparametro" type="list" default="valore di default" label="Nome visualizzato nel backend" description="Descrizione che appare nel tooltip.">
    <option value="0">Disattivato</option>
    <option value="1">Attivato</option>
</param>
 

Un parametro può essere dei seguenti tipi:

  • text: da come risultato un box di testo;
  • textarea da come risultato una textarea ed è possibile specificare gli attributi rows e col;
  • list da come risultato una select ed è possibile specificare le option;
  • radio da come risultato dei radio ed è possibile specificare le option;
  • spacer da come risultato una riga vuota che serve da spaziatore;

Installazione del plugin

Il nostro plugin è finito e non ci resta che installarlo e provarlo.

Per fare questo prima di tutto creiamo un archivio zip contenente i nostri due file e chiamiamolo plugin-aboutme.zip (il nome qui non ha importanza, potete scegliere qualsiasi altro nome preferiate).

Andiamo nel backend del nostro sito joomla e clicchiamo su "Estensioni" dal menu superiore e quindi su "Installa/Disinstalla".

Gestione Estensioni, installazione plugin

Scegliamo quindi il nostro archivio zip e clicchiamo su "Carica file e installa".

Riceveremo quindi un messaggio di conferma e il testo contenuto nel tag description del nostro file XML.

Plugin installato correttamente

Clicchiamo di nuovo quindi su "Estensioni" e dopodichè andiamo in "Gestione plugin".
Noteremo quindi il nuovo plugin About Me, apriamolo, attiviamolo e modifichiamo i parametri.

Scriviamo il testo che vogliamo far apparire al posto della stringa {aboutme} nella textarea del parametro testo del nostro plugin.

Parametri

Inseriamo quindi la famosa stringa {aboutme} in un qualsiasi articolo o contenuto statico del nostro sito e apriamo l'url dello stesso per verificarne il funzionamento.

Federico Capoano è un freelance web designer / web developer proveniente da Roma che attualmente vive nelle isole Baleari, in Spagna, dove lavora con clienti provenienti da varie parti del globo.

Et voila! la stringa {aboutme} viene sostituita dal testo inserito nel backend!

Conclusione

Ora non vi rimane che sperimentare e giocare con questo codice per creare dei plugin più complessi.

Per essere in grado di sviluppare plugin più complessi dovreste conoscere più a fondo il framework di Joomla e il funzionamento dei plugin.
Seguendo questi links potrete trovare altre informazioni utili per approfondire le vostre conoscenze:

Qui invece potrete trovare i files usati nell'articolo: plugin-aboutme.zip

Licenza Creative Commons
Questa guida è pubblicata con una Licenza Creative Commons.

Nemesis Design Federico Capoano è un freelance web designer / web developer proveniente da Roma che attualmente vive in Spagna, nelle Isole Baleari. Ideatore e fondatore di Joomlashow.it, gestisce una piccola impresa individuale conosciuta come "Nemesis Design" che offre servizi di web design a ibiza.

Puoi tenerti aggiornato su nuovi articoli e tips & tricks su Joomla seguendolo su Twitter.

Commenti utenti  

Visualizza 7 di 7 commenti

traduzione Plugin

Ciao 
Ottimo articolo. 
Ho realizzato un paio di plugin ma ho sempre problemi con i file INI per le traduzioni. 
Sembra non vengono letti. 
 
Ho preso spunto da questo articolo 
http://docs.joomla.org/ How_to_create_a_content_plugin #INI_file.28s.29 
facendo come "ivi" spiegato ma non il plugin mostra sempre i parametri in inglese (l'inglese hardcoded nel file xml) 
 
Hai qualche dritta?

Scritto da: Nicola (Guest) 07-11-2009 19:11

RE: traduzione Plugin

Ciao Nicola, 
 
non avevo notato il tuo commento, a volte capita anche a me. Forse dipende dal punto in cui viene salvato il file ini?

Scritto da: nemesis (Membro) 13-11-2009 12:25

RE: traduzione Plugin

Sì, dipende da dove vengono salvati i file. 
Dai un'occhiata sul funzionamento dei file di lingua per i moduli che ho scritto nell'articolo Sviluppare un modulo per Joomla 1.5, il funzionamento dovrebbe essere lo stesso.

Scritto da: nemesis (Membro) 18-11-2009 15:40

Parametri non letti!

Ciao nemesis. Sto provando la tua guida ma come per altri plugin di esempio non capisco perchè non vengono visualizzati i parametri, cioè nella schermata di gestione del plugin non compare nessuno dei parametri inseriti nel file xml. Ti è mai capitato?

Scritto da: Arnaldo (Guest) 10-04-2010 00:08

RE: Parametri non letti!

Ciao Arnaldo, 
 
no non mi è mai capitato il problema da te descritto. 
 
Potrebbe esserci un'errore di sintassi. 
 
Dato che il sistema dei commenti non permette di scrivere del codice, nel caso tu volessi mostrare il codice xml che hai utilizzato per il tuo plugin apri un post sul forum.

Scritto da: nemesis (Membro) 10-04-2010 11:11

Eccellente!

davvero un tutorial impeccabile! Complimenti e grazie di cuore.

Scritto da: Ingonline (Guest) 02-12-2010 20:39

Richiamare un plugin dall'articolo

Ciao. Il tuo articolo e' ottimo, ma ho un problema: vorrei richiamare il mio plugin dall'articolo connle parentesi graffe e passandomun parametro. Devo utilizzare sempre i parametri del xml? io vorrei fare una cosa tipo {plugin parametro} 
 
Ciao e grazie.

Scritto da: Paolo (Guest) 06-09-2011 09:52

Aggiungi il tuo commento

Solo gli utenti possono commentare un'articolo.
‹ Precedente   Successivo ›

Categorie

Ricerca

Web Design

Login

Hai dimenticato la password?

Registrati