English version  | Version française
Tables liées avec Structures_DataGrid

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.

Démonstration

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.

Prérequis

Pour faire fonctionner cet exemple vous avez besoin de PHP4 ou PHP5 et des paquets PEAR suivants :

Source
<?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>
Icon
Faites-nous part de votre projet
Progress bar