Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Cms / framework : Come creare un plugin in Joomla (seconda parte)

Proseguiamo oggi il nostro tutorial per capire come creare un plugin per Joomla. Nella prima puntata abbiamo creato un plugin base, oggi lo andremo ad estendere rendendolo cosi utile e, perché no, distribuibile come extension ufficiale di Joomla!

Cms / framework

Nella prima parte di questo tutorial abbiamo creato un plugin base per Joomla. Il plugin cosi come è attualmente, funziona bene ma non svolge alcun compito utile ad un sito di produzione. La scritta "hello world" infatti è a scopo puramente illustrativo. Vediamo come dare utilità alla nostra estensione appena installata.

Nasce un problema pratico: dobbiamo apportare delle modifiche al plugin ma ormai si tratta di codice installato, sarebbe molto scomodo modificare la cartella sul desktop ed ogni volta dover disinstallare e reinstallare l'estensione. Nessun problema: se siamo in locale, andiamo direttamente nella cartella del nostro sito (plugins/content/evidenziatore) e lavoriamo sui file che Joomla ha appena installato (creando di fatto una copia di quanto avevamo sul desktop). Se siamo in remoto, possiamo continuare a lavorare sulla nostra copia e sovrascrivere via Ftp il file. I file sono anche qui dentro la cartella "plugins/content/evidenziatore".
Apriamo quindi evidenziatore.php dalla cartella del sito e vediamo di fare qualcosa di più utile della scritta Hello World.
Abbiamo visto che onContentBeforeDisplay ritorna una stringa che viene aggiunta al contenuto. Ok. A noi servirebbe invece cambiare il testo, cosi da aggiungere uno sfondo colorato. Come vediamo, tra i parametri ce ne è uno che viene passato per riferimento, è l'oggetto $row. Il fatto che sia passato per riferimento ci consente di modificarlo in maniera definitiva.

A questo punto è semplice evidenziare, ad esempio, tutte le lettere "e":
$row->introtext = str_replace('e','<span style="background-color:gold;">e</span>',$row->introtext);
$row->text = str_replace('e','<span style="background-color:gold;">e</span>',$row->text);



Ora si tratta finalmente di rendere il nostro plugin utile. Andiamo in amministrazione ed impostiamo qualche keyword che dovrà essere evidenziata, ne mettiamo una per riga, come da immagine qui a fianco.

Utilizzare i parametri all'interno del plugin è, grazie al framework di Joomla, davvero facile:
$keywords = $this->params->get('keywords');
(keywords è il nome della textarea impostata fin dal file di configurazione come parametro)

public function onContentBeforeDisplay($context, &$row, &$params, $page=0)
    {
        $parts = explode(".", $context);
        if ($parts[0] != 'com_content')
        {
            return false;
        }
        $keywords = $this->params->get('keywords');
        if(!empty($keywords)){
            $keywords = explode("n",$keywords);
            foreach($keywords as $keyword){
                $keyword = trim($keyword);
                $row->introtext = str_replace($keyword,'<span style="background-color:gold;">'.$keyword.'</span>',$row->introtext);
                $row->text = str_replace($keyword,'<span style="background-color:gold;">'.$keyword.'</span>',$row->text);
            }
        }
       
        return ;
    }


Ecco qui il risultato del nostro lavoro! L'articolo presenta evidenziate, in giallo, le due parole che avevamo scelto in area amministrativa. 

Nulla ci vieta di scegliere altre parole, anche più di due, o magari una combinazione di parole ("separate page", ad esempio).

A questo punto se volete esercitarvi un pò, potete aggiungere un nuovo campo (di tipo testo semplice) in configurazione in cui memorizzare l'esadecimale che poi il plugin userà per evidenziare i testi.

Se poi siete proprio bravi, potete usare sempre un unico campo di configurazione, andando ad usare un separatore per personalizzare gli esadecimali, ad esempio

page|ff0000
content|00ff00

e cosi via (in questo esempio, page viene evidenziato in rosso, content in verde). Dovete ovviamente intervenire sul codice della funzione onContentBeforeDisplay.

A proposito di quest'ultima funzione, una precisazione. Avete visto ad un certo punto il codice

        $parts = explode(".", $context);
        if ($parts[0] != 'com_content')
        {
            return false;
        }

questo codice serve per evitare (return false) che il plugin funzioni se l'articolo viene richiamato da componenti diversi da com_content. Non vogliamo, ad esempio, che il contenuto venga stampato evidenziato se l'articolo serve ad un componente di archivio di feed per comunicare con blog esterni.

Se durante l'esercizio avete commesso qualche errore e non riuscite a venirne fuori, potete scaricare il sorgente completo del plugin illustrato nell'articolo.