L'exemple suivant montre comment afficher deux tables de données liées, avec le composant Structures_DataGrid. Il utilise l'échantillon de base de données MySQL world database, et permet de cliquer sur un pays dans la première table, pour afficher les villes qui appartiennent à ce pays dans la seconde table.
L'exemple ci-dessous est interactif. Cliquez sur un nom de pays pour afficher les villes correspondantes. Vous pouvez également trier les données et utiliser la pagination.
Pour faire fonctionner cet exemple vous avez besoin de PHP4 ou PHP5 et des paquets PEAR suivants :
- Structures_DataGrid >= 0.8.0
- Structures_DataGrid_Renderer_HTMLTable >= 0.1.3
- Structures_DataGrid_DataSource_MDB2 >= 0.1.3
- MDB2 >= 2.1.0
- MDB2_Driver_mysql >= 1.1.0
- PHP_Compat >= 1.5.0
Téléchargement: Source PHP Feuille de style CSS
<?php
/*
* Exemple de tables liées avec Structures_DataGrid
* Auteur: Olivier Guilyardi - http://www.samalyse.com
*/
require_once 'PEAR.php';
require_once 'Structures/DataGrid.php';
require_once 'HTML/Table.php';
require_once 'MDB2.php';
require_once 'PHP/Compat/Function/http_build_query.php';
PEAR::setErrorHandling(PEAR_ERROR_PRINT);
// Connexion à la base de données:
// dsn.php contient une seule ligne: $DSN = "mysql://user:pass@host/database";
include "dsn.php";
$database =& MDB2::connect($DSN);
// Methode "callback" de formattage, pour créer les liens pays
function makeCountryLink($data)
{
$country = $data['record']['name'];
$request = $_GET;
$request['country_code'] = $data['record']['code'];
$request['country'] = $country;
$query = htmlentities(http_build_query($request));
return "<a href=\"?$query\">$country</a>";
}
// Création de la grille de données (DataGrid) des pays
$countries =& new Structures_DataGrid(10);
$countries->setDefaultSort(array('population' => 'DESC'));
$countries->bind("SELECT * FROM Country", array('dbc' => &$database));
$countries->generateColumns(array(
'name' => 'Pays',
'population' => 'Population',
));
// Création des liens dans la grille pays
$column =& $countries->getColumnByField('name');
$column->setFormatter('makeCountryLink');
// Création de la grille de donnée des villes
$cities =& new Structures_DataGrid(10);
$cities->setRequestPrefix('city_');
$cities->setDefaultSort(array('population' => 'DESC'));
$code = $database->escape(@$_GET['country_code']);
$where = $code ? "WHERE CountryCode = '$code'" : '';
$cities->bind("SELECT * FROM City $where", array('dbc' => &$database));
$cities->generateColumns(array(
'name' => 'Ville',
'population' => 'Population',
));
// Création d'un lien de remize à zéro
$request = $_GET;
unset($request['country_code']);
unset($request['country']);
$query = htmlentities(http_build_query($request));
$resetLink = "<a href=\"?$query\">[X]</a>";
// Début de l'affichage
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<div class="grid">
<?php
// Rendu de la grille des pays
$table = new HTML_Table();
$countries->fill($table);
$table->setCaption("Monde");
$table->altRowAttributes(0, array(), array ('class' => 'odd'), true);
echo $table->toHTML();
echo "<p class=\"paging\">";
$countries->render('Pager', array('pagerOptions' => array('delta' => 0)));
echo "</p>";
?>
</div>
<div class="grid cities">
<?php
// Rendu de la grille des villes
$table = new HTML_Table();
$cities->fill($table);
$ofCountry = @$_GET['country'] ? "{$_GET['country']} $resetLink" : "Villes";
$table->setCaption("$ofCountry");
$table->altRowAttributes(0, array(), array ('class' => 'odd'), true);
echo $table->toHTML();
echo "<p class=\"paging\">";
$cities->render('Pager', array('pagerOptions' => array('delta' => 0)));
echo "</p>";
?>
</div>
</body>
</html>


