J’avais présenté ce fabuleux plugin pour jQuery qu’est Datatables et expliqué rapidement ce dont il est capable.
Aujourd’hui je vous propose une mise en situation, avec comme objectif l’interaction avec une base de données, une traduction en français (ou une autre langue parmi les 29 disponibles), la mise en forme avec l’aide jQuery-UI, et d’autres fonctionnalités.
Tout d’abord si vous ne possédez pas encore le plugin téléchargez-le ici.
Ensuite nous allons placer le code de notre tableau dans notre page, imaginons que l’on souhaite afficher des utilisateurs :
<table id="datatable" >
<thead>
<tr>
<th>Nom</th>
<th>Prénom</th>
<th>Inscription</th>
<th>Mail</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="4">Chargement des données...</td>
</tr>
</tbody>
</table>
Maintenant le code Javascript. Nous allond indiquer que l’on souhaite récupérer les données via un fichier côté serveur :
$(document).ready(function() {
$('#datatable').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "get_data.php"
} );
} );
Le plugin ira donc récupérer le fichier get_data.php pour remplir le tableau. Les données renvoyées par le fichier php doivent être au format JSON.
Voici un exemple du contenu de get_data.php inspiré de la documentation de Datatables mais vous êtes libre de modifier le code pour utiliser PDO, ou une autre méthode d’accès à la base de données si vous utilisez un autre SGBD que MySQL.
<?php
/* MySQL connection */
$gaSql['user'] = "username";
$gaSql['password'] = "password";
$gaSql['db'] = "mydb";
$gaSql['server'] = "localhost";
$gaSql['type'] = "mysql";
$gaSql['link'] = mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password'] ) or
die( 'Could not open connection to server' );
mysql_select_db( $gaSql['db'], $gaSql['link'] ) or
die( 'Could not select database '. $gaSql['db'] );
/* Paging */
$sLimit = "";
if ( isset( $_GET['iDisplayStart'] ) )
{
$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
mysql_real_escape_string( $_GET['iDisplayLength'] );
}
/* Ordering */
if ( isset( $_GET['iSortCol_0'] ) )
{
$sOrder = "ORDER BY ";
for ( $i=0 ; $i<mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
{
$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
".mysql_real_escape_string( $_GET['sSortDir_'.$i] ) .", ";
}
$sOrder = substr_replace( $sOrder, "", -2 );
}
/* Filtrage - Remplace le filtrage côté client, peut donc être long si la base de données est importante
*/
$sWhere = "";
if ( $_GET['sSearch'] != "" )
{
$sWhere = "WHERE nom LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
"prenom LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
"inscription = '".mysql_real_escape_string( $_GET['sSearch'] )."' OR ".
"mail = '".mysql_real_escape_string( $_GET['sSearch'] )."'";
}
$sQuery = "SELECT id, nom, prenom, inscription, mail FROM users $sWhere $sOrder $sLimit";
$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
$sQuery = "SELECT FOUND_ROWS()";
$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
$iFilteredTotal = $aResultFilterTotal[0];
$sQuery = "SELECT COUNT(id) FROM users";
$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
$aResultTotal = mysql_fetch_array($rResultTotal);
$iTotal = $aResultTotal[0];
$sOutput = '{';
$sOutput .= '"sEcho": '.intval($_GET['sEcho']).', ';
$sOutput .= '"iTotalRecords": '.$iTotal.', ';
$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
$sOutput .= '"aaData": [ ';
while ( $aRow = mysql_fetch_array( $rResult ) )
{
$sOutput .= "[";
$sOutput .= '"'.addslashes($aRow['nom']).'",';
$sOutput .= '"'.addslashes($aRow['prenom']).'",';
$sOutput .= '"'.addslashes(date(H:i d/m/Y'', $aRow['inscription'])).'",';
$sOutput .= '"'.addslashes($aRow['mail']).'"';
$sOutput .= '"Détails"';
$sOutput .= "],";
}
$sOutput = substr_replace( $sOutput, "", -1 );
$sOutput .= '] }';
echo $sOutput;
function fnColumnToField( $i )
{
if ( $i == 0 )
return "nom";
else if ( $i == 1 )
return "prenom";
else if ( $i == 2 )
return "inscription";
else if ( $i == 3 )
return "mail";
}
?>
Et voilà notre tableau se remplit automatiquement avec les données renvoyées par le fichier get_data.php.
La méthode utilisée dans l’exemple pour renvoyer les données au format JSON est un peu barbare, utiliser json-encode sur un array serait à mon humble avis plus approprié, à vous de voir.
intval($_GET['sEcho']),
'iTotalRecords'=>$iTotal,
'iTotalDisplayRecords'=>$iFilteredTotal);
$aaData = array();
while ( $aRow = mysql_fetch_array( $rResult ) )
{
$tmp = array();
$tmp[] = addslashes($aRow['nom']);
$tmp[] = addslashes($aRow['prenom']);
$tmp[] = date(H:i d/m/Y'', $aRow['inscription']);
$tmp[] = addslashes($aRow['mail']);
$tmp[] = '<a href="user.php?id='.$aRow['id'].'">Détails</a>';
$aaData[] = $tmp;
}
$sOutput['aaData'] = $aaData;
echo json_encode($sOutput);
Je n’ai pas testé le code mais cela devrait fonctionner.
Bon tout ça c’est bien beau mais on aimerait bien avoir une traduction en français plutôt que d’avoir Show 10 entries, Search ect, car même si on comprend ça fait tâche.
Et bien le plugin nous offre la possibilité de traduire le plugin dans pas moins de 29 langues dont l’anglais, l’allemand, l’espagnol, le portugais, le chinois etc.
Pour mettre en place la traduction il n’y a rien de plus simple, on va rajouter une option dans la déclaration de notre tableau :
$(document).ready(function() {
$('#datatable').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "get_data.php",
"oLanguage": { "sUrl": "datatable_fr.txt" }
} );
} );
Il suffit ensuite de placer la traduction correspondante dans le fichier datatable_fr.txt. La liste des codes à placer est disponible ici.
Vous pouvez modifier les traductions ou bien créer les vôtres très simplement. Pour éviter un appel du fichier sur le serveur vous pouvez également faire comme ceci :
$(document).ready(function() {
$('#datatable').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "get_data.php",
"oLanguage": { "sProcessing": "Traitement en cours...",
"sLengthMenu": "Afficher _MENU_ éléments",
"sZeroRecords": "Aucun élément à afficher",
"sInfo": "Affichage de l'élement _START_ à _END_ sur _TOTAL_ éléments",
"sInfoEmpty": "Affichage de l'élement 0 à 0 sur 0 éléments",
"sInfoFiltered": "(filtré de _MAX_ éléments au total)",
"sInfoPostFix": "",
"sSearch": "Rechercher:",
"sUrl": "",
"oPaginate": {
"sFirst": "Premier",
"sPrevious": "Précédent",
"sNext": "Suivant",
"sLast": "Dernier"
}
}
} );
} );
Enfin on aimerait styliser notre tableau et donc utiliser la puissance de jQuery-UI. Pour cela rien de plus simple, il suffit de posséder les fichiers de jQuery-UI (.js, .css et les images) et de les avoir inclus. Comme pour la traduction une simple ligne suffit :
...
"bJQueryUI": true,
...
Vous pouvez voir encore plus d’exemple sur cette page.