Contactez-nous : 01 71 18 39 72 | contact@thecodingmachine.com
Suivez-nous sur Facebook

Une liste paginée et triable avec Drupal 6 en 5 minutes

Dans cet article, apprenez à créer rapidement une table paginée et triable en utilisant les fonctions fournies par Drupal. L'exemple développé ci-dessous doit permettre d'afficher la liste des articles de blogs d'un site.

1. Introduction : les fonctions natives de Drupal

Voici quelques fonctions de drupal utiles pour la pagination:

  • pager_query : permet de réécrire une requête SQL en y ajoutant les clauses SQL de pagination (nombre d'enregistrements à retourner, et index du premier enregistrement),
  • theme : une fonction très importante de Drupal qui permet d'afficher toute sorte d'objets selon certains templates. Ici, nous allons appeler cette fonction avec les "hooks" 'table' (pour l'affichage de la liste) et 'pager' pour les éléments de pagination,
  • tablesort_sql : permet d'ajouter à la requête la clause SQL ORDER BY afin de prendre en compte le tri.

2. Etape 1 : Construction de la liste des données à afficher

Tout d'abord, il faut définir la structure de la source de données. Cette structure est décrite dans le tableau $header:

$header = array(
	array('data' => t('Id du noeud'), 'field' => 'n.nid'),
	array('data' => t('Titre'), 'field' => 'n.title'),
	array('data' => t('Date'), 'field' => n.created')
);

Ensuite, on écrit la requête SQL en y ajoutant la clause ORDER BY avec la fonction tablesort_sql. Ici, nous allons chercher les contenus de type blog :

$sql = "SELECT * FROM {node} WHERE type = 'blog'";
$sql .= tablesort_sql($header);

Ensuite, il faut parcourir le résultat de la requête afin de construire la source de données (on utilise alors la fonction pager_query:

$limit = 10; // Nombre d'éléments par page
$result = pager_query($sql, $limit);
while ($blog = db_fetch_object($result)) {
	$rows[] = array(
		'data' => array(
			array('data' => $blog->nid),
			array('data' => $blog->title),
			array('data' => date('d-m-Y'), $blog->created)
		),
		'id' => 'blog-'. $blog->id,
	);
}

3. Etape 2 : Génération du code HTML de la table

Ici, nous allons utiliser la fonction 'theme' afin de générer le code HTML de la table et des éléments de pagination :

$html = theme('table', $header, $rows);
$html .= theme('pager', NULL, $limit);

Pour plus de clarté, voici la fonction entière:

function getBlogs(){
	$header = array(
		array('data' => t('Id du noeud'), 'field' => 'n.nid'),
		array('data' => t('Titre'), 'field' => 'n.title'),
		array('data' => t('Date'), 'field' => n.created')
	);
	
	$sql = "SELECT * FROM {node} WHERE type = 'blog'";
	$sql .= tablesort_sql($header);
	
	$limit = 10; // Nombre d'éléments par page
	$result = pager_query($sql, $limit);
	while ($blog = db_fetch_object($result)) {
		$rows[] = array(
			'data' => array(
				array('data' => $blog->nid),
				array('data' => $blog->title),
				array('data' => date('d-m-Y'), $blog->created)
			),
			'id' => 'blog-'. $blog->id,
		);
	}
	
	$html = theme('table', $header, $rows);
	$html .= theme('pager', NULL, $limit);
	
	return $html;
}

4. Pour aller plus loin

Pour certaines requêtes, il faut ajouter une requête de comptage spécifique au page_query. En effet, pager_query génère automatiquement cette requête si elle n'est pas passée en argument. Mais dans le cas de certaines requêtes complexes, notamment s'il existe une clause SQL GROUP BY, il faut la créer soi-même. Dans le cas de la requête suivante (liste des types de noeuds et nombre de noeuds associés):

$sql = "SELECT type, count(*) FROM {node} GROUP BY type";

... il faut spécifier explicitement la requête de comptage :

$sqlCount = "SELECT count(*) FROM (SELECT * FROM {node} GROUP BY type) as foo";
//...
/* Le troisième argument est utile pour préciser l'identifiant du pager dans le 
cas ou la page en contient plusieurs */
$result = pager_query($sql, $limit, null, $sqlCount); 


En espérant que cet article vous aura été utile ! N'hésitez pas à réagir si vous avez des commentaires ou des questions.