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:
$link(obbligatorio) - riferimento alla connessione al db$db(obbligatorio) - stringa con il nome del database$query(obbligatorio) - stringa contentente la query di tipo SELECT$recPerPage=0- Numero di record per pagina. Default=0 (tutti i record senza paginazione)$pk = NULL- Nome della chiave primaria (se più di una, separate da virgola) da immettere manualmente, se NULL (default) il riconoscimento è automatico$qs = NULL- Stringa contenente l'eventuale querystring associata alla pagina in cui viene pubblicato il datagrid.
| Nome | Tipo | Default | Note |
|---|---|---|---|
setPkIsVisible() |
boolean | false | Determina se le colonne relative alla chiave primaria sono visibili o no |
setLinkPage() |
string | NULL | Imposta 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:
// 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 = & 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:

Volovo chiederti se la classe datagrid avendo i comandi di mysql si poteva avere con quelli di mssql?
Aspetto tua risposta
Grazie Mattia
Mattia, purtroppo conosco pochissimo MSSQL per averci lavorato una sola volta, e con Visual Basic. Puoi provare a cambiare tu i metodi per l'interazione con il database. Se ti può essere di aiuto, leggi questo post ( http://www.mariospada.net/2008/09/php-connettere-un-database-ms.html ) che tratta su come interagire con MS Access, probabilmente puoi utilizzare la stessa classe. Tra l'altro ho usato lo stesso CSS per la rappresentazione dei dati. Fammi sapere!
Ciao
il tuo script è utilissimo
Avrei bisogno di una mano... ho la necessità di stampare due tabelle affiancate, ma non riesco a capire cosa vi sia da modificare nel tuo codice.
Le tabelle appaiono sempre una sotto l'altra.
Grazie
Davide, è un problema di CSS. Non sono un esperto di fogli stile, ma credo che impostando come attributo delle 'table' il float:left, oltre a una larghezza prefissata, il problema si risolverebbe.
Ciao,
stavo provando ad usare il tuo datagrid, ma ho un problema con la paginazione e la query.
Mi spiego, la query è come questa
$query ="SELECT id,ragionesoc,codicefiscale,citta,telefono,fax,mail,nome_commerciale FROM anagrafica_commerciali where ragionesoc like '$ragionesoc%' and nome_commerciale like '$nome_commerciale' ORDER by ragionesoc";
e le opzioni sono queste
$mydatagrid = & new datagrid($link,$nomedb,$query,10);
$mydatagrid->setLinkPage("visualizzaanagrafica.php");
$mydatagrid->setLinkLabel("");
$mydatagrid->setLinkTitle("modifica");
$mydatagrid->setPrev("");
$mydatagrid->setNext("");
$mydatagrid->setPkIsVisible(true);
$mydatagrid->setSummaryTable("Lista anagrafiche");
$mydatagrid->setCaptionTable("lista anagrafica clienti");
$mydatagrid->makeTable();
Quello che succede è che la prima pagina mostra correttamente i primi dieci risultati della query, mentre le pagine successive, mostrano i dati di una query in cui l'and viene ignorato.
in pratica mostra tutti i dati.
Se noti il numero di pagina da stampare, nella prima videata vedi, ad esempio 3, e se vai alla pagina successiva il numero di pagine diventa 35.
C'è qualcosa che sto sbagliando?
E' come se la query venisse modificata " strada facendo" dal datagrid al cambio delle pagine.
Ciao e grazie
Vincenzo
Ciao Vincenzo, quando è attiva la paginazione la query viene sempre modificata aggiungendo in fondo la clausola LIMIT. Ho fatto una piccola prova riproducendo la tua query e la paginazione funziona, piuttosto ho notato che lasci vuote sia la setPrev() che setNext(), in questo modo non viene generato il link alle pagine precedenti/successive. Comunque se vuoi fare un debug più approfondito puoi inserire nel codice della classe, precisamente nel metodo getNewArrData(), dopo la riga:
$newQuery = $this->query ." LIMIT ".$this->start.",".$this->paginator;
questa riga:
print "".$newQuery."";
che ti stampa la query che viene rigenerata. Così hai qualche elemento in più per scovare il bug. Fammi sapere.
Mario