web-dev-qa-db-fra.com

Algorithme de pagination intelligente

Je cherche un exemple d'algorithme de pagination intelligente. Par smart, ce que je veux dire, c'est que je veux seulement montrer, par exemple, deux pages adjacentes à la page en cours, donc au lieu de me retrouver avec une liste de pages ridiculement longue, je la tronque.

Voici un exemple rapide pour clarifier les choses ... voici ce que j'ai maintenant:

Pages: 1 2 3 4 [5] 6 7 8 9 10 11

C'est ce que je veux finir avec:

Pages: ... 3 4 [5] 6 7 ...

(Dans cet exemple, je montre seulement 2 pages adjacentes à la page en cours)

Je l’implémente en PHP/Mysql, et la pagination "basique" (sans trucating) est déjà codée, je cherche juste un exemple pour l’optimiser ... Cela peut être un exemple dans n’importe quel langage, aussi longtemps que cela me donne une idée de la façon de le mettre en œuvre ...

29
jeannicolas

J'ai eu le même besoin il y a quelque temps.

Voici l'article que j'avais l'habitude de faire (avec le code PHP:): Digg-Style Pagination

Cela fonctionne assez rapidement et a quelques ajouts à ce que vous essayez de faire, comme:

[1] 2 3 4 5 6 ... 100 
 1 [2] 3 4 5 6 ... 100 
 ... 
 1 ... 4 5 [6 ] 7 8 ... 100
28
changelog

Un peu en retard =), mais voici mon tour:

function Pagination($data, $limit = null, $current = null, $adjacents = null)
{
    $result = array();

    if (isset($data, $limit) === true)
    {
        $result = range(1, ceil($data / $limit));

        if (isset($current, $adjacents) === true)
        {
            if (($adjacents = floor($adjacents / 2) * 2 + 1) >= 1)
            {
                $result = array_slice($result, max(0, min(count($result) - $adjacents, intval($current) - ceil($adjacents / 2))), $adjacents);
            }
        }
    }

    return $result;
}

Exemple:

$total = 1024;
$per_page = 10;
$current_page = 2;
$adjacent_links = 4;

print_r(Pagination($total, $per_page, $current_page, $adjacent_links));

Sortie ( @ Codepad ):

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Autre exemple:

$total = 1024;
$per_page = 10;
$current_page = 42;
$adjacent_links = 4;

print_r(Pagination($total, $per_page, $current_page, $adjacent_links));

Sortie ( @ Codepad ):

Array
(
    [0] => 40
    [1] => 41
    [2] => 42
    [3] => 43
    [4] => 44
)
15
Alix Axel

J'ai commencé par le billet de lazaro et essayé de créer un algorithme robuste et léger avec javascript/jquery ... Aucune bibliothèque de pagination supplémentaire et/ou volumineuse n'est nécessaire ... exemple: http://jsfiddle.net/97JtZ/1/

var totalPages = 50, buttons = 5;
var currentPage = lowerLimit = upperLimit = Math.min(9, totalPages);

//Search boundaries
for (var b = 1; b < buttons && b < totalPages;) {
    if (lowerLimit > 1 ) { lowerLimit--; b++; }
    if (b < buttons && upperLimit < totalPages) { upperLimit++; b++; }
}

//Do output to a html element
for (var i = lowerLimit; i <= upperLimit; i++) {
    if (i == currentPage) $('#pager').append('<li>' + i + '</li> ');
    else $('#pager').append('<a href="#"><li><em>' + i + '</em></li></a> ');
}
7
Edwin
List<int> pages = new List<int>();
int pn = 2; //example of actual pagenumber
int total = 8;

for(int i = pn - 9; i <= pn + 9; i++)
{
  if(i < 1) continue;
  if(i > total) break;
  pages.Add(i);
}

return pages;
2
lazaro

J'ai fait un cours de pagination et mis sur Google Code il y a quelque temps. Découvrez sa assez simple  http://code.google.com/p/spaceshipcollaborative/wiki/PHPagination

$paging = new Pagination();
$paging->set('urlscheme','class.pagination.php?page=%page%');
$paging->set('perpage',10);
$paging->set('page',15);
$paging->set('total',3000);
$paging->set('nexttext','Next Page');
$paging->set('prevtext','Previous Page');
$paging->set('focusedclass','selected');
$paging->set('delimiter','');
$paging->set('numlinks',9);
$paging->display();
2
Jacob

Je voudrais utiliser quelque chose de simple sur la page que vous montrez à la pagination, comme:

if (
  $page_number == 1 || $page_number == $last_page ||
  $page_number == $actual_page ||
  $page_number == $actual_page+1 || $page_number == $actual_page+2 ||
  $page_number == $actual_page-1 || $page_number == $actual_page-2
  ) echo $page_number;

Vous pouvez l’adapter pour afficher chacune une dizaine de pages avec l'opérateur % ...

Je pense que l'utilisation de la casse switch () serait préférable dans ce cas, je ne me souviens plus de la syntaxe pour l'instant

Rester simple :)

0

Le code de la pagination CodeIgniter - peut être trouvé sur GitHub

(ce que vous appelez) La pagination intelligente peut être réalisée par configuration.

$config['num_links'] = 2;

Le nombre de liens "numériques" que vous souhaitez avant et après le numéro de page Sélectionné. Par exemple, le numéro 2 placera deux chiffres De chaque côté, comme dans l'exemple des liens tout en haut de cette page.

0
Natrium

S'il est possible de générer la pagination sur le client, je suggèrerais mon nouveau plugin Pagination: http://www.xarg.org/2011/09/jquery-pagination-revised/

La solution à votre question serait:

$("#pagination").paging(1000, { // Your number of elements
        format: '. - nncnn - ', // Format to get Pages: ... 3 4 [5] 6 7 ...
        onSelect: function (page) {
                // add code which gets executed when user selects a page
        },
        onFormat: function (type) {
                switch (type) {
                case 'block': // n and c
                        return '<a>' + this.value + '</a>';
                case 'fill': // -
                        return '...';
                case 'leap': // .
                        return 'Pages:';
                }
        }
});
0
Robert Eisele