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.
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,
);
}
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;
}
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.