Supporto volontario e collaborativo per Joomla!® in italiano

Esportare le tabelle di joomla 1.5 in un foglio di calcolo con Chronoforms.

logo

In alcune occasioni può essere utile poter esportare in un foglio di calcolo i dati memorizzati nelle tabelle del nostro sito. Da un lavoro che sto sviluppando per l'applicazione Albo Pretorio ho estrapolato questa variante che può agire su tutte le tabelle presenti nel nostro database e può essere di utilizzo generale per esportare le tabelle in foglio di calcolo e poterne elaborare localmente i dati.

In questo articolo esamineremo la procedura per poter ottenere il risultato in siti con Joomla 1.5, mentre in un altro articolo vedremo la versione per Joomla 1.6. Qui l'articolo per Joomla 1.6.

La base di partenza è un sito in cui è installato il componente Chronoforms. Per siti in Joomla 1.5 occorrerà il componente Chronforms v 3.2.0, mentre per siti in Joomla 1.6 occorrerà l'ultima versione di Chronoforms v 4 RC1.8.

Per siti in Joomla 1.5 che utilizzano il plugin Mootools Update attivato, che non è compatibile con Chronoforms v 3.2.0, potrà essere usata la seconda procedura, quella per Joomla 1.6, con la differenza che in questi casi dovrà usato Chronforms v 4 RC1.8 nella versione per Joomla 1.5.

Il primo passo sarà creare un form vuoto. Per questo basta premere il bottone verde "Nuovo" in alto a destra, nella sezione Form Manager di Chronoforms. Si apre la finestra General del form. In Form Name inseriamo il nome del form. In questo caso ho scelto export_cvs1, ma qualsiasi altro nome a voi più utile andrà bene. Anche se l'email non c'entra nulla dovremo abilitare a Yes la voce Email the results, è un trucchetto che ci consentirà si fruire di altre funzionalità di chronoforms. Nella voce Load Chronoforms CSS/JS Files abiliteremo l'opzione Yes per fruire dei CSS standard di chronoforms.

export_general

Passiamo ora alla sezione From Code, cliccando sull'etichetta.Clicchiamo ora sui segni +/- in corrispondenza del campo From Html.

export_formcode

Si aprirà l'area di testo ed in essa inseriremo con copia incolla il seguente codice:

 

 
<?php
if ( !$mainframe->isSite() ) { return; }
global $mainframe;
 
// controllo amministratore loggato
$user =& JFactory::getUser();
if ($user->usertype<>"Super Administrator") { ?>
<div class="form_item">
  <div class="form_element cf_heading">
    <h1>Area riservata non è consentito l'accesso ai non autorizzati.</h1>
  </div>
  <div class="cfclear"> </div>
</div>
 
<?php } else { ?>
 
<div class="form_item">
  <div class="form_element cf_heading">
    <h1 class="cf_text">Export tabelle in foglio di calcolo</h1>
  </div>
  <div class="cfclear"> </div>
</div>
 
 
<div class="form_item">
  <div class="form_element cf_dropdown">
    <label class="cf_label" style="width: 150px;">Tabelle</label>
    <select class="cf_inputbox required" id="select_0" size="1" title=""  name="tabella">
    <option value="">Scegli una tabella</option>
 
<?php
 //questo codice permette di popolare la dropdown con le tabelle di chronforms
 
    $db =& JFactory::getDBO();         
    $query = "SHOW TABLES LIKE '%chronoforms%'";
    //$query = "SHOW TABLES ";
    $db->setQuery($query);
    $nomes = $db->loadResultArray();
print_r($nomes);
    $nome_options = "";
      $i=0;
      foreach ( $nomes as $v ) {
      $nome_options .= "<option value='".$nomes[$i]."' >".$nomes[$i]."</option>";
      $i++;
      }
 
     echo $nome_options;
?>      
    </select>
    <a class="tooltiplink" onclick="return false;"><img height="16" border="0" width="16"
  class="tooltipimg" alt="" src="components/com_chronocontact/css/images/tooltip.png"/></a>
        <div class="tooltipdiv">Tabella :: Scegliere la tabella da esportare</div>
  </div>
  <div class="cfclear"> </div>
</div>
 
<div class="form_item">
  <div class="form_element cf_dropdown">
    <label class="cf_label" style="width: 150px;">Separatore di campo</label>
    <select class="cf_inputbox required" id="select_1" size="1" title=""  name="separatore">
    <option value="">Scegli un separatore</option>
    <option value=",">Virgola</option>
    <option value=";">Punto e virgola</option>
    <option value="|">Barra verticale</option>
    <option value="tab">Tabulazione</option>
 
    </select>
    <a class="tooltiplink" onclick="return false;"><img height="16" border="0" width="16"
  class="tooltipimg" alt="" src="components/com_chronocontact/css/images/tooltip.png"/></a>
  <div class="tooltipdiv">Separatore :: Scegli il separatore di campo più opportuno. Tieni 
  presente che la virgola può essere all'interno di qualche campo e quindi creare problemi.</div>
  </div>
  <div class="cfclear"> </div>
</div>
 
 
 
<div class="form_item">
  <div class="form_element cf_button">
    <input value="Invia" name="button_2" type="submit" /><input type="reset" name="reset" 
  value="Reset"/>
  </div>
  <div class="cfclear"> </div>
</div>
<?php } ?>
 
 

 

Questo codice ha la funzione di realizzare i seguenti elementi.

  1. Una casella dropdown popolata con tutte le tabelle di Chornoforms presenti nel nostro database sul server.
  2. Un'altra casella dropdown in cui potremo selezionare il separatore di campo più opportuno per i dati memorizzati della tabella scelta.
  3. Il tasto di invio delle scelte fatte.

Il codice PHP nella parte alta permette di creare un filtro che limita l'accesso del form al solo amministratore del sito quando è loggato nel front_end.

Modificando invece la query che popola la dropdown con i nomi delle tabelle si potrà ottenere di abilitare solo le cartelle di chronoforms oppure tutte le cartelle del database. In questo caso occorre che la query contenga anche la WHERE che filtra le tabelle, altrimenti per vedere tutte le tabelle del sito basta usare la query senza la WHERE. Il codice standard contiene di default il filtro attivo sulle sole ta

Andiamo ora nel campo On Submit code - before sending email: (il trucchetto della email abilitata nella finestra general era necessario per attivare la lettura del codice inserito in questo campo in fase di esecuzione del form) apriremo anche questo premendo su +/- ed inseriremo con copia ed incolla il seguente codice:

 
<?php
if ( !$mainframe->isSite() ) { return; }
// continue PHP here
    global $mainframe;
       $database =& JFactory::getDBO();
       include_once JPATH_BASE.DS.'administrator'.DS.'components'.DS.'com_chronocontact'.
DS.'excelwriter'.DS."Writer.php";
 
       $separatore= JRequest::getVar('separatore','','post');
if( $separatore=="tab") {$separatore="\t";}
       $tablename = JRequest::getVar('tabella','','post');
       $tables = array( $tablename );
       $result = $database->getTableFields( $tables );
       $table_fields = array_keys($result[$tablename]);
       //unset($table_fields[0],$table_fields[2],$table_fields[17]);
 
       $database->setQuery( "SELECT * FROM ".$tablename."" );
       $datarows = $database->loadObjectList();
       $titcol = 0;
       foreach($table_fields as $table_field){
          if($titcol){$csvline .=$separatore;}
          $csvline .= $table_field;
          $titcol++;
       }
       $csvline .="\n";      
       $datacol = 0;
       $rowcount = 1;
       foreach($datarows as $datarow){
          foreach($table_fields as $table_field){
             if($datacol){$csvline .=$separatore;}
             $csvline .= '"'.addslashes($datarow->$table_field).'"';
             $datacol++;
          }
          $csvline .="\n";
          $datacol = 0;
          $rowcount++;
       }       
       if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'])) {
          $UserBrowser = "Opera";
       }
       elseif (ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'])) {
          $UserBrowser = "IE";
       } else {
          $UserBrowser = '';
       }
       $mime_type = ($UserBrowser == 'IE' || $UserBrowser == 'Opera') ? 'application/octetstream'
 : 'application/octet-stream';
       @ob_end_clean();
       ob_start();
 
       header('Content-Type: ' . $mime_type);
       header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
 
       if ($UserBrowser == 'IE') {
          header('Content-Disposition: inline; filename="' . "ChronoForms - ".$tablename
." - ".date("d_m_Y").'.csv"');
          header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
          header('Pragma: public');
       }
       else {
          header('Content-Disposition: attachment; filename="' . "ChronoForms - ".
$tablename." - ".date("d_m_Y").'.csv"');
          header('Pragma: no-cache');
       }
       print $csvline;
       exit();
    ?>
 
 

Questo codice interamente in PHP , trovato nel forum di Chronoengine ed adattato a questo tipo di uso, legge i contenuti delle tabelle, crea i dati per l'intestazione delle tabelle ed i contenuti di righe e colonne del foglio di calcolo.

Si salva il form e si abilita la sua pubblicazione. Per vedere tutto all'opera vi sono due possibilità.

  1. Cliccare sul link sulla destra del nome del form in Form manager.
  2. Si può creare un collegamento al form in una voce di menù.

Per attivare la seconda, si apre il menù interessato e si clicca su Nuovo, poi in Seleziona tipo di voce di menù sceglieremo  Crono Forms.

voce_menu1

Nella finestra successiva che si aprirà inseriremo il Titolo della voce di menù, in Mostra in nome di modulo del menù.

voce_menu2

Nel riquadro di destra invece inseriremo nel campo Form name il nome del nostro form.

voce_menu3

Fatto questo potremo salvare il tutto. A questo punto non resta che andare nel frontend di Joomla, loggarsi come amministratore e poi cliccare sulla voce di menù appena creata. Si aprirà il nostro form e vedremo un risultato simile a questo.

voce_menu4

Scegliamo il form da esportare e selezioniamo il separatore di campo e clicchiamo su Invia. Si apre una nuova finestra di servizio simile alla seguente.

voce_menu5

Clicchiamo su Ok e dopo qualche secondo si aprirà il programma gestore dei fogli di calcolo (Nel mio caso LibreOffice) con un'altra finestra di servizio in cui ci presenterà alcune opzioni, simile alla seguente.

voce_menu6

Scegliamo per Tipo carattere Unicode (UTF 8) e come separatore spunteremo la casella Altri e nel campo a destra inseriremo come separatore quello scelto nel form, cioè la barra vericale. Confermiamo le scelte premendo su OK. A questo punto si apre la pagina del foglio di calcolo che mostra il risultato che volevamo ottenere, ovvero i dati della tabella disponibili nella finestra del foglio di calcolo per tutte le elaborazioni che vorremo fare.

voce_menu7

Qui l'articolo per Joomla 1.6




vales - Valerio Sichi
15.05.2011

http://valesweb.altervista.org

CommentaCommenta questo articolo sul forum