Joomla! 2.5 aggiungere ACL a componente sprovvisto

Joomla! 2.5 - Aggiungere supporto ACL ad una Estensione che ne è sprovvista

A volte capita di dover dare dei permessi particolati ad un utente, senza però dargli l'accesso a tutto il sito.
Joomla! 2.5 sotto questo punto di vista offre la gestione ACL (Access Control List), un po complessa da digerire all'inizio, ma molto potente e versatile.

Se ad esempio voglio dare la possibilità ad un utente (in genere il committente del sito web), la possibilità di caricare file e/o foto con Phoca Download e Phoca Gallery,
non serve altro che entrare nel pannello di configurazione dei componenti, cliccare sul pulsante a destra Opzioni e accediamo a varie funzioni tra cui le ACL relative al componente.
CPanel Phoca Download
 
 
Alcune applicazioni però non hanno quel pulsante, perché non è stato previsto dallo sviluppatore.

Una di queste è JNews, l'ottimo componente per inviare le Newsletter:
CPanel JNews

Come potete vedere non ha il pulsante Opzioni e quindi la possibilità di modificare l'ACL.

Normalmente non è un problema... perché l'accesso "Administrator" che fornisco al committente permette di accedere anche a Jnews.
Mi trovo però in una situazione particolare, ovvero NON un committente, ma ben 7 (SETTE) e a breve diventeranno 8 e forse 9.
Concedere a 7 o più persone inesperte un accesso "Administrator" al Back-End non è salutare ne per il sito ne per la salute del Webmaster :-)


Facendo una breve ricerca ho trovato due soluzioni:
  1. componente per gestire le ACL, ACLManager, che però è a pagamento;
  2. modiche al codice del componente "incriminato", con lo svantaggio però di doverle ripetere ad ogni aggiornamento, fino a quando non vengono introdotte nativamente.

Scelgo la seconda soluzione, usando le istruzioni contenute in questo articolo (in inglese): http://www.aclmanager.net/it/blog/general/31-how-to-add-basic-acl-support-to-your-extension
Il sito è lo stesso che vende il componente ACLManager.

NOTA:
foobar e com_foobar è un nome di fantasia è deve essere sostituito, con il nome del componente che occorre modificare, in tutte le occorrenze.



1) Aggiunta/Modifica del file config.xml

Creiamo o modifichiamo il file:  administrator/components/com_foobar/config.xml inserendo le seguenti righe:
 
<?xml version="1.0" encoding="utf-8"?> <config>  <fieldset name="permissions" label="JCONFIG_PERMISSIONS_LABEL" description="JCONFIG_PERMISSIONS_DESC"> <field name="rules" type="rules" label="JCONFIG_PERMISSIONS_LABEL" filter="rules" component="com_foobar" section="component"> <action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" /> <action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" /> </field> </fieldset> </config>
 
Se il file esiste già, le righe vanno semplicemente aggiunte, verificando ovviamente che non siano già presenti righe simili.


2) Aggiunta controllo di Accesso

occorre modificare il file: administrator/components/com_foobar/foobar.php e aggiungere il controllo di accesso a tutto il componente, aggiungendo, subito dopo il codice:

defined('_JEXEC') or die;

le seguenti 4 righe:

// Access check.
if (!JFactory::getUser()->authorise('core.manage', 'com_foobar')) {
   return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
}


3) Aggiungere il pulsante "Opzioni" alla toolbar di Joomla!

occorre modificare il file: administrator/components/com_foobar/views/foobars/view.html.php aggiungendo le seguenti righe
 
// Options button.
if(JFactory::getUser()->authorise('core.admin', 'com_foobar')) {
JToolBarHelper::preferences('com_foobar'); }
 
Nel caso di JNews c'è un problema. Dato che non tutti i componenti sono uguali, può capitare che il ile view.html.php non esista.
In questo caso occorre cercare di capire come funziona il componente, individuare la sua Toolbar ed infine aggiungere le righe richieste.


3.1) Aggiunta del pulsante in Opzioni in JNews (valido per Joomla! 2.5)

Aprire il file: administrator/components/com_jnews/toolbar.jnews.php

All'interno della funzione:

switch ($action) {

cercare, nelle ultime righe della funzione:

    default :
       break;
}

Modificare quelle righe in questo modo:

     default :
         switch ($task) {

            default :
                jNews_Menu::CPANEL();
                break;
         }
         break;
 }



Subito dopo inizia la funzione "jNews_Menu":

class jNews_Menu {


vanno inserite, le seguenti righe:

     public static function CPANEL() {

        jNews_Menu::_wizardBtn( 'edit-subscriber' );
        JToolBarHelper::divider();

        // Options button.
        if (JFactory::getUser()->authorise('core.admin', 'com_jnews')) {
          JToolBarHelper::preferences('com_jnews');
        }

     }


4) Aggiungere la stringa per la lingua

modificare il file: administrator/language/it-IT/it-IT.com_foobar.ini

e aggiungere la seguente riga:

COM_FOOBAR_CONFIGURATION="Configurazione di FooBar"


Una volta che avete caricato tutti i file, nelle rispettive directory del Server Web, basta entrare nel componente per notare la bellissima Icona Opzioni :-)
CPanel JNews Fixed

Quasi quasi mando la soluzione a quelli di Joobi, magari aggiungono il pulsante nella prossima versione :-)