PHP: un datagrid XHTML valido con paginazione per applicazioni web

Esempio di datagrid
Esempio di datagrid
Questo datagrid è un aggiornamento di quello presentato in questo post. Ho apportato alcune sostanziali modifiche per renderlo più flessibile ed accessibile, pur mantenendo le stesse prerogative che mi ero imposto inizialmente.
La modifica più urgente era quella di implementare un sistema di paginazione. Questo ha comportato inevitabilmente il cambiamento della modalità di passaggio dei dati al costruttore della classe. Mentre prima era sufficiente fornire il riferimento al risultato di una query, adesso è necessario passare il link alla connessione, il nome del database ed infine la query in formato stringa.

Le caratteristiche iniziali, che sono state ulteriormente migliorate, sono:

  • XHTML valido
  • Personalizzabile tramite fogli stile CSS
  • colonna aggiuntiva di link per azioni tipo “modifica”
  • Aspetto gradevole e alternanza di colorazione delle singole righe
  • Compatibile sia con PHP4 che con PHP5

Le nuove caratteristiche:

  • Semplice sistema di paginazione nel <tfoot> della tabella. Il numero di record per pagina da visualizzare vengono impostati come parametro del costruttore, default=0
  • Autoriconoscimento della o delle chiave primarie. Nel caso in cui l’autoriconoscimento fallisca, è possibile impostarle manualmente come parametro del costruttore
  • Il link nella colonna aggiuntiva può contenere una querystring, in questo caso il link alla chiave primaria viene appeso con “&” altrimenti con “?”
  • Possibilità di utilizzare il datagrid in una pagina che già contiene una querystring. In questo caso è necessario passare la querystring esistente come parametro al costruttore.
  • Possibilità di impostare numerose proprietà dei tag HTML

I parametri del costruttore:

  1. $link (obbligatorio) – riferimento alla connessione al db
  2. $db (obbligatorio) – stringa con il nome del database
  3. $query (obbligatorio) – stringa contentente la query di tipo SELECT
  4. $recPerPage=0 – Numero di record per pagina. Default=0 (tutti i record senza paginazione)
  5. $pk = NULL – Nome della chiave primaria (se più di una, separate da virgola) da immettere manualmente, se NULL (default) il riconoscimento è automatico
  6. $qs = NULL – Stringa contenente l’eventuale querystring associata alla pagina in cui viene pubblicato il datagrid.
Elenco dei metodi:
NomeTipoDefaultNote
setPkIsVisible()booleanfalseDetermina se le colonne relative alla chiave primaria sono visibili o no
setLinkPage()stringNULLImposta il link alla pagina da richiamare per le modifiche (Riferimento alla chiave primaria). Se NULL, la colonna aggiunitva non viene visualizzata.
setLinkLabel()string“Edit”Imposta il testo da visualizzare nella colonna dei link. Può contenere codice HTML per caricare un’icona.
setLinkTitle()string“Edit”Imposta il titolo del tag <a> nella colonna dei link.
setPrev()string“prev”Imposta il testo da visualizzare per la paginazione indietro. Può contenere codice HTML per caricare un’icona.
setNext()string“next”Imposta il testo da visualizzare per la paginazione in avanti. Può contenere codice HTML per caricare un’icona.
setSummaryTable()string“Data table”Imposta il testo per la descrizione “summary” della tabella.
setCaptionTable()string“Table”Imposta il testo per l’intestazione della tabella.
makeTable()Stampa la tabella

Un esempio di utilizzo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Database connection params
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'prova';
$query = 'select * from es_libri';
// open the connection to the db server
$link = mysql_connect($host,$user,$password);
include ('datagrid.class.php');
// datagrid class with some options
$mydatagrid = &amp; new datagrid($link,$database,$query,3); // 3 rec per page
$mydatagrid->setLinkPage("test.php");
$mydatagrid->setLinkLabel("<img src='./mod.gif' alt='edit' />");
$mydatagrid->setLinkTitle("edit");
$mydatagrid->setPrev("<img src='./prev.gif' alt='previous' />");
$mydatagrid->setNext("<img src='./next.gif' alt='next' />");
$mydatagrid->setPkIsVisible(true);
$mydatagrid->setSummaryTable("Elenco dei libri in biblioteca del settore informatica");
$mydatagrid->setCaptionTable("Elenco libri informatica");
$mydatagrid->makeTable();

Per vedere l’esempio, cliccare qui.
Questo, invece è il pacchetto contenente la classe, il file di esempio, il foglio stile, le gif e l’sql per la creazione della tabella “es_libri”, (da creare in un db chiamato “prova”).

Note:

Per quanto abbia fatto diverse prove, non posso dire di aver coperto tutti i possibili errori, fate qualche prova prima di metterlo in produzione!.

Conclusioni:

Per il futuro mi riprometto di aggiungere la caratteristica di autoriconoscimento dei tipi dei campi e la formattazione automatica con allineamento a destra per i numeri

Riferimenti ed approfondimenti:

PHP: un semplice datagrid per applicazioni web

Esempio di datagridE’ piuttosto frequente, quando si sviluppano applicazioni web, di dover presentare i dati di una query in un datagrid, ovvero in una tabella HTML. In tutti questi casi, può essere comodo avere già pronta una classe che formatta i dati nella tabella e scrive per noi il codice HTML. Questa classe che ho scritto, pur essendo molto semplice e spartana, presenta alcune caratteristiche interessanti:

  • Il codice generato è XHTML valido
  • La presentazione è gestita da fogli stile CSS, quindi facilmente personalizzabile
  • E’ possibile, tramite il passaggio di parametri, creare una colonna aggiuntiva di link per azioni tipo “modifica”, o “dettaglio”
  • E’ possibile visualizzare o nascondere la colonna contenente la chiave primaria
  • Aspetto gradevole e alternanza di colorazione delle singole righe per una più facile lettura dei dati

Il codice della classe è molto semplice ed autoesplicativo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
class dataGrid
{
  var $tabData;
  var $pkField;
  var $pkIsVisible;
  var $summaryTable;
  var $linkPage;
  var $linkLabel;
 
 function dataGrid($tabData, $pkField,
          $pkIsVisible, $summaryTable,
          $linkPage, $linkLabel)
 {
    $this->arrData=$tabData;
    $this->pkId=$pkField;
    $this->pkIsVisible=$pkIsVisible;
    $this->summaryTable=$summaryTable;
    $this->linkPage=$linkPage;
    $this->linkLabel=$linkLabel;
 }
 
 function makeTable()
 {
  $rowStyle=true;
  $printTh = false;
  $printTd = false;
  print("<table class='datatable' cellspacing='0'
        summary='$this->summaryTable'>");
        print("<tr>");
  $fldCount = mysql_num_fields($this->arrData);
  for ($i=0; $i<$fldCount; $i++ ) {
   $fldName = mysql_field_name($this->arrData, $i);
   if($this->pkId!=$fldName){
    $printTh = true;
   }
   else{
    if($this->pkIsVisible){
     $printTh = true;
    }
   }
   if($printTh){
    print("<th scope='col'>");
    print($fldName);
    print("</th>");
    $printTh = false;
   }
  }
  print("</tr>");
  while($row=mysql_fetch_array($this->arrData)){
   print("<tr>");
   $rowStyle=!$rowStyle;
   for($i=0; $i<$fldCount; $i++) {
    if($rowStyle)
     $tdStyle="<td class='alt'>";
    else
     $tdStyle="<td>";
    $fldName = mysql_field_name($this->arrData, $i);
    if($this->pkId!=$fldName){
     $printTd = true;
    }
    else{
     if($this->pkIsVisible){
      $printTd = true;
     }
    }
    if($printTd){
     print($tdStyle);
     print($row[$i]);
     print("</td>");
     $printTd = false;
    }
   }
   if($this->linkPage!=NULL){
    print($tdStyle."[<a href=".$this->linkPage."?"
          .$this->pkId."=".$row[$this->pkId]
          ." title='".$this->linkLabel."'>"
          .$this->linkLabel
          ."</a>]</td>");
   }
   print("</tr>");
  }
  print("</table>");
 }
}

Come utilizzare la classe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//---------------------------------------------
// Database connection params
// Modify for your connection, db and query
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'prova';
$query = 'select * from es_libri order by autori';
//---------------------------------------------
// open the connection to the db server
$link = mysql_connect($host,$user,$password);
// change to the right database
mysql_select_db($database);
// do the SQL query
$result = mysql_query($query);
include ('datagrid.class.php');
// Print HTML
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
echo '<html xmlns="http://www.w3.org/1999/xhtml">';
echo '<head>';
echo '<meta http-equiv="Content-Type" 
     content="text/html; charset=iso-8859-1" />';
echo '<title>CSS Tables</title>';
echo '<link href="styles.css" rel="stylesheet" 
     type="text/css" />';
echo '</head><body>';
// Use datagrid class with full options
$mydatagrid = & new datagrid($result,"ISBN",true,
           "Tabella","test.php","modifica");
$mydatagrid->makeTable();
echo '<hr />';
// Use datagrid class without showing primary key, 
//with link option
$result = mysql_query($query);
$mydatagrid = &amp; new datagrid($result,"ISBN",false,
           "Tabella","test.php","modifica");
$mydatagrid->makeTable();
echo '<hr />';
// Use datagrid class without link options
$result = mysql_query($query);
$mydatagrid = &amp; new datagrid($result,"ISBN",true,
           "Tabella",NULL,NULL);
$mydatagrid->makeTable();
echo '<hr />';
// Use datagrid class without showing primary key
$result = mysql_query($query);
$mydatagrid = &amp; new datagrid($result,"ISBN",false,
           "Tabella",NULL,NULL);
$mydatagrid->makeTable();
echo '</body></html>';

Per vedere l’esempio, cliccare qui.
Questo, invece è il pacchetto contenente la classe, il file di esempio, il foglio stile e l’sql per la creazione della tabella “es_libri”, (da creare in un db chiamato “prova”).

Note:

Il codice per questa classe viene fornito ‘as is’, senza controllo di errori, né prove efficaci in produzione.

Conclusioni:

Ogni programmatore di applicazioni web dovrebbe avere una buona scorta di classi di utilità generale, da tenere in serbo per l’occasione giusta. E’ un buon metodo per risparmiare molto tempo, credo che questa semplice classe possa far parte della collezione!

Riferimenti ed approfondimenti: