Pagination sur Drupal 7 avec Views et une source externe
Le module communautaire « Views » nous apporte une solution simple et efficace pour générer des paginations dans Drupal. Cependant, il arrive que cette solution ne soit pas suffisante notamment lors de l'utilisation de tables de données externes ou de l'utilisation de web services.
Voici deux exemples simples pour générer une pagination avec l'API Drupal.
Vous pouvez générer une pagination sur une requête sql grâce à la couche d'abstraction de Drupal 7. Il suffit d'ajouter simplement la directive « extend » sur la requête. Utilisez ensuite « theme('pager') » et Drupal fera le reste !
function monmodule_get_listing_page() {
$query = db_select('role_permission', 'rp')
->extend('PagerDefault')
->condition('module', 'node')
->fields('rp', array('rid', 'permission'))
->limit(10);
$results = $query->execute();
$rows = array();
foreach ($results as $result) {
$rows[] = array($result->rid, $result->permission);
}
$output = theme(
'table',
array(
'header' => array(t('rid'), t('Permission')),
'rows' => $rows,
)
);
$output .= theme('pager');
return $output;
}
Il est aussi possible d'utiliser la pagination manuellement grâce aux deux fonctions « pager_find_page() » et « pager_default_initialize() » :
function monmodule_get_listing_page() {
$max_per_page = 10;
$current_page = pager_find_page();
$max_data = _ws_get_max_data();
$current_offset = $current_page * $max_per_page;
$rows = _ws_get_range($current_offset, $max_per_page);
pager_default_initialize($max_data, $max_per_page);
$output = theme(
'table',
array(
'header' => array(t('Id'), t('First Name'), t('Last Name'), t('Address')),
'rows' => $rows,
)
);
$output .= theme('pager');
return $output;
}
/**
* Fake Web service
*/
function _get_fake_data() {
if (!isset($_SESSION['fake_data'])) {
for ($i = 0; $i < 100; $i++) {
$row = array($i);
for ($j = 0; $j < 3; $j++) {
$row[] = str_shuffle('abcdefjhijkl');
}
$data[] = $row;
}
$_SESSION['fake_data'] = $data;
}
return $_SESSION['fake_data'];
}
function _ws_get_range($start, $max) {
$data = _get_fake_data();
return array_slice($data, $start, $max);
}
function _ws_get_max_data() {
$data = _get_fake_data();
return count($data);
}