Tabella paginata e ordinabile in Drupal

 
Tabella paginata e ordinabile

Nella realizzazione di interfaccie di report può capitare di dover creare delle tabelle che visualizziino una serie di informazioni. Spesso, se i dati sono molti, è necessario ricorrere alla creazione di tabelle paginate. In altri casi, o in aggiunta a questo, può essere necessario andare a realizzare dei sistemi che permettano di fvariare i criteri di ordinamento dei dati estratti, così da migliorare l'usabilità del sistema.

Queste operazioni spesso sono operazioni che porterebero via un pò di tempo per la realizzazione e sono decisamente poco divertenti da implmentare (ma servono e quindi devono essere fatte). Vediamo come possiamo velocizzarne la realizzazione con Drupal.

Innanzitutto è necessario individuare i dati che dobbliamo andare a visualizzare, in questo esempio ipotizzeremo di avere una tabella dei prodotti in cui sono memoriizzati una serie di campi, tra i quali:

code
Il codice del prodotto.
decript
La descrizione del prodotto.
price
Il prezzo di vendita unitario del prodotto.
quantity
La rimanenza a magazzino del prodotto.

Questi dati devono essere visualizzati in una tabella e poichè la quantità di prodotti è elevata decidiamo di mantenere una paginazione che mosti 25 elementi per volta.

Iniziamo a definire quale è la query iniziale per l'estrazione dei dati, tralasciando il fatto che si debba limitare l'estrazione ai 25 prodotti.

<?php
  $query
= "SELECT code, descript, price, quantity FROM {test_sortable}";
?>

come buona norma ricordiamoci di estrarre i camppi elencando i nomi effettivi e non usando * e usando il nome della tabella tra graffe per permettere al sistema di funzionare anche in caso si utilizzino table prefix.

La paginazione

L'aggiunta del sistema di paginazine è quantomeno banale, è sufficiente utilizzare la funzione pager_query per ottenere il risultato desiderato:

<?php
  $q
= pager_query($query, 25);
?>

in questo modo si dice al sistema di occuparsi della paginazione estraendo solamente 25 elementi per volta.

Proseguiamo all'estrazione dei dati e alla loro rappresentazione in tabella tramite:

<?php
  $header
= array(
   
t("Codice"),
   
t("Descrizione"),
   
t("Prezzo"),
   
t("Quantità"),
  );
 
 
// Estraggo i valori da inserire in tabella
 
while($res = db_fetch_array($q)) {
   
// Estrai i dati e generi le $rows
   
$rows[] = array(
     
$res['code'],
     
$res['descript'],
     
$res['price'],
     
$res['quantity'],
    );
  }
 
 
// Temizzo la tabella
 
$output  = theme('table', $header, $rows);
?>

e successivamente aggiugiamo nell'output la visualizzazione del paginatore:

<?php
 
// Temizzo il pager
 
$output .= theme('pager', NULL, 25, 0);
?>

Già in questo modo abbiamo visualizzato i nostri dati in tabella con paginazione.

Volendo sarebbe possibile ridurre ulteriormente la quantià di codice scritto, in particolare nella generazione delle righe della tabella, dato che i valori estratti sono già rappresentati da un array, potremmo avere semplicemente:

<?php
 
// Estraggo i valori da inserire in tabella
 
while($res = db_fetch_array($q)) {
   
// Estrai i dati e generi le $rows
   
$rows[] = $res;
  }
?>

anche se questo modo di scrivere potrebbe risultare, a chi non è abbituato, meno intuitivo.

L'ordinamento

All'inizio avevamo anche espresso l'interesse per avere delle tabelle con dati ordinabili a discrezione dell'utente. Nulla di più banale da realizzare, dovremmo svlgere solamente alcuni semplici passaggi. Il primo riguarda il modo di definizione dell'header della tabella, che ora cambia un pò. Vediamo come deve essere rappresnetato:

<?php
  $header
= array(
    array(
     
'data'  => t('Codice'),
     
'field' => 'code',
     
'sort'  => 'desc',
    ),
    array(
     
'data'  => t('Descrizione'),
     
'field' => 'descript',
     
'sort'  => 'desc',
    ),
    array(
     
'data'  => t('Prezzo'),
     
'field' => 'price',
     
'sort'  => 'desc',
    ),
    array(
     
'data'  => t('Rimanenze'),
     
'field' => 'quantity',
     
'sort'  => 'desc',
    ),
  );
?>

Come vedete ogni campo è orarappresentato da un array anzichè da una solo valore. Questo array ha una serie di parametri che risultano essere:

data
Il testo che sarà visibile all'utente all'interno della tabella.
field
Il nome del campo che verrà utilizzato per l'ordinamento all'interno della query.
sort
Il valore di ordianmento predefinito per questo campo.

Una volta indicato l'header con i campi che devono essere ordinabili e le informazioni ad esse collegate, proseguiamo andando a modificare la query di ordinamento tramite la funzione tablesort_sql.
Il codice di estrazione dei dati ora diventa:

<?php
 
// La rendo ordinabile secondo i paraetrui scelti dall'utente
 
$query .= tablesort_sql($header);
?>

E deve essere inserito subito dopo la definizione della query (e prima dell'inserimento del sistema di paginazione).

Fatto questo avremo il risultato atteso, ovvero una tabella con i risultati paginati e con la possibilità di variare il criterio di ordinamento semplicemente cliccando sull'intestazione della tabella il campo che vogliamo usare per l'ordinamento. Potete trovare un esempio in questa pagina o scaricarvi il modulo di esempio che trovate in allegato a questa pagina.

AllegatoDimensione
Modulo di esempio2.18 KB

Altri contenuti che potrebbero interessarti

  • Drupal è uno dei migliori CMS (la versione 4.7 è giunta seconda al contest internazionale, subito dopo Joomla, ma con la versione 5 probabilmente si avrà il balzo al primo posto!) in circolazione per la realizzazione di siti nato nel 2001 e giunto ormai alla sua quinta versione...
  • Esempio di vista generata dall'integrazione del nostro modulo con views
    Alzi la mano chi non ha mai usato views. Alzi la mano che l'ha mai usato. Ok, non proprio tutti ma buona parte di voi ha alzato la mano, questo perchè è sicuramente uno strumento potentissimo per la visualizzazione delle informazioni, quindi è fondamentale (o comunque molto utile) andare ad...
  • Interfaccia di esempio per la selezione tramite autocompletamento in cascata
    Come spesso capita si utilizzano select per andare a far effettuare delle scelte agli utenti, e come abbiamo visto precentemente è possibile usare le funzionalità ajax per fare in modo che delle select secondarie varino in funzione della prima scelta. Cosa succede, invece, quando si hanno centinaia...
  • La volta scorsa, nel parlare di ottimizzazione del frontend di siti generici (e Drupal in particolare) avevamo affrontato alcune delle problematiche principali, tra cui appunto la generazione di sottodomini per lo smistamento degli asset statici [1], così da parallelizzare il più possibile il...

Commenti

Ritratto di Marco

field di tipo select

Sto studiando con drupal 7.19 da 2 settimane e avrei bisogno di utilizzare come opzioni di una select, di una mia webform, dei campi da estrarre dal DB (nella fattispecie sono termini di una tassonomia). L'utente deve inserire dei dati e tra questi scegliere da una lista, che potrebbe essere variabile xke dipendente dagli elementi inseriti nella tassonomia. Non so dove mettere il codice php (+sql) che ho già testato com myphpadmin.
Posso integrare anche le funzioni x l'autocompletamento x velocizzare la scelta dell'utente?

ciao e grazie

Ritratto di mavimo

Hi già dato un occhio

Hi già dato un occhio a:

Ciao
Marco

Ritratto di massimo

e integrarlo con webform??

C'è la possibilità di integrare il tutto con webform? e magari tra i risultati della tabella esporre dei link che visualizzino altri dati? (anche in un webform?
Grazie mille!

Ritratto di Gianluca

Drupal7

Ciao,
non avresti voglia di aggiornare questo post per Drupal7? La gestione delle tabelle è più com0plicata che in D6, e non ci sono grandi aiuti...
Grazie comunque ;-)
Gianluca

Ritratto di mavimo

Non prometto nulla, ma ci

Non prometto nulla, ma ci posso provare ;)

Ritratto di Anonimo

Consiglio

Ho letto il tuo tutorial Tabella paginata e ordinabile in Drupal che è molto bello. Ti volevo chiedere se ho 12 colonne e queste fanno si che la tabella esca dal blocco centrale della pagina sai mica come posso ovviarea questo problema?
Ciao e grazie
Gabriele

Ritratto di mavimo

Una prima soluzione potrebbe

Una prima soluzione potrebbe essere di inserire un overflow Y al contenitore che contiene la tabella tramite CSS, in questo modo se la tabella è troppo larga l'elemento che la contiene mostrerà una barra di scorrimento orizzontale.

Invia nuovo commento





  • Elementi HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <h2> <h3> <h4> <table> <thead> <tbody> <tr> <th> <td>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Linee e paragrafi vanno a capo automaticamente.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente

Maggiori informazioni sulle opzioni di formattazione.



Condividi contenuti