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 : Esportare csv con una procedura esterna a Joomla

In situazioni particolari o di emergenza (leggi: cliente che chiede modifiche fuori-budget da realizzare nel minor tempo possibile ) può essere utile estendere Joomla attraverso una pagina esterna. Vediamo ad esempio come creare una procedura di export csv di dati in joomla.

Cms / framework

Lo so, lo so che non dovrei neanche scriverli certi tutorial... però a chi non è mai capitato di trovarsi davanti una richiesta last-minute di un cliente o una modifica fuori budget? La strada corretta sarebbe quella di sviluppare sempre e comunque secondo gli standard del cms/framework su cui stiamo lavorando (per l'articolo di oggi, parliamo di Joomla); ma non sempre è possibile.
Ecco allora uno script da posizionare all'interno della cartella /administrator del nostro joomla, con il quale possiamo eseguire operazioni on-the-fly come un export csv di dati estratti dal database o, perchè no, un crontab.

<?php
    //init Joomla Framework
    define( '_JEXEC', 1 );
    define( 'DS', DIRECTORY_SEPARATOR );
    define( 'JPATH_BASE', realpath(dirname(__FILE__).DS.'..' ));

    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

    $mainframe = JFactory::getApplication('administrator');
    $user = JFactory::getUser();
    $isroot = $user->authorise('core.admin');
    if(!$isroot){
        die('accesso negato');
    }
    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=elenco_iscritti.csv");
    header("Pragma: no-cache");
    header("Expires: 0");
    //DBQuery
    $database = JFactory::getDBO();;
    $result = $database->setQuery('la mia query where articolo_id='.JFactory::getApplication()->input->get->get('id'))->loadAssocList();
    $stringa = '';
    if(!empty($result)){
        foreach($result as $articolo){
            $stringa .= '"'.addslashes($articolo['dato']).'";"'.addslashes($articolo['testo']).'";\n";
        }
    }
    echo $stringa;
?>



Vediamo cosa accade riga per riga.
Le prime righe non fanno altro che includere i file necessari per il caricamento dell'ambiente di Joomla. In questo modo abbiamo a disposizione tutte le funzioni del cms compresa la connessione al database, la verifica delle sessioni e via dicendo.
Con


    $mainframe = JFactory::getApplication('administrator');
    $user = JFactory::getUser();
    $isroot = $user->authorise('core.admin');
    if(!$isroot){
        die('accesso negato');
    }


verifichiamo che l'utente si sia in precedenza loggato nel pannello di amministrazione e che abbia i permessi corretti. E' un passaggio opzionale, a me è servito per un export di dati csv degli utenti che ovviamente doveva esser riservato all'admin (la procedura veniva raggiunta da quest'ultimo attraverso un apposito link che avevo inserito nel template di gestione articoli).

Il resto del file non è altro che un esempio di "come far qualcosa", nella fattispecie eseguire una query ed esportare i risultati in un csv, con le dovute intestazioni:


    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=elenco_iscritti.csv");
    header("Pragma: no-cache");
    header("Expires: 0");

come vedete abbiamo a disposizione tutte le funzioni del framework di joomla, comprese le query e la gestione degli input:


$result = $database->setQuery('la mia query where articolo_id='.JFactory::getApplication()->input->get->get('id'))->loadAssocList();