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 si occupa esclusivamente della validazione lato server delle informazioni, ma spesso è consigliabile prevedere ad una prima validazione dei dati inseriti dall'utente lato client, in modo da evitare l'invio della richiesta limitando quindi le possibilità di errore. Ovviamente la validazione...
  • 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...
  • Pagina di ricerca con filtri dinamici nelle views
    Le viste sono uno strumento estremamente potente e permettono di andare ad elaborare le informazioni creando degli elementi (pagine, blocchi, ...) di presentazione. La possibilità di usare dei filtri esposti ne fa degli strumenti adatti alla creazione di strumenti di ricerca dei contenuti. L'...
  • Chi avesse iniziato ad utilizzare Drupal 7 si sarà senz'altro d'accordo che stanno nascendo dei temi di partenza molto sofisticati da cui partire per la realizzazione di temi, in particolare sta emergendo sempre più Omega 3. Questi temi, però possono avere necessità di essere estesi per aggiungere...

Commenti

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