PHP: un semplice datagrid per applicazioni web

by: spadamar23-11-2007

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: