Question

Je cherche un exemple d'algorithme de pagination intelligente. Ce que je veux dire, c’est que je veux seulement montrer, par exemple, 2 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 avec quoi je veux me retrouver:

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 le "basique" la pagination (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, à condition que cela me donne une idée de la façon de le mettre en œuvre ...

Était-ce utile?

La solution

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

Voici l'article que j'ai utilisé pour le faire (avec du code PHP): pagination de style Digg

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

Voici le code du lien brisé:

<?php
    /*
        Place code to connect to your DB here.
    */

    // How many adjacent pages should be shown on each side?
    $adjacents = 3;

    /* 
       First get total number of rows in data table. 
       If you have a WHERE clause in your query, make sure you mirror it here.
    */
    $query = "SELECT COUNT(*) as num FROM portfolio";
    $total_pages = mysql_fetch_array(mysql_query($query));
    $total_pages = $total_pages[num];

    /* Setup vars for query. */
    $limit = 2;                                 //how many items to show per page
    if($page) 
        $start = ($page - 1) * $limit;          //first item to display on this page
    else
        $start = 0;                             //if no page var is given, set start to 0

    /* Get data. */
    $query = "SELECT category, uname, title FROM portfolio LIMIT $start, $limit";
    $portfolio = mysql_query($query);

    /* Setup page vars for display. */
    if ($page == 0) $page = 1;                  //if no page var is given, default to 1.
    $prev = $page - 1;                          //previous page is page - 1
    $next = $page + 1;                          //next page is page + 1
    $lastpage = ceil($total_pages/$limit);      //lastpage is = total pages / items per page, rounded up.
    $lpm1 = $lastpage - 1;                      //last page minus 1

    /* 
        Now we apply our rules and draw the pagination object. 
        We're actually saving the code to a variable in case we want to draw it more than once.
    */
    $pagination = "";
    if($lastpage > 1)
    {   
        $pagination .= "<div class="\"pagination\"">";
        //previous button
        if ($page > 1) 
            $pagination.= "<a href="\"diggstyle.php?page=$prev\"">« previous</a>";
        else
            $pagination.= "<span class="\"disabled\"">« previous</span>";   

        //pages 
        if ($lastpage < 7 + ($adjacents * 2))   //not enough pages to bother breaking it up
        {   
            for ($counter = 1; $counter <= $lastpage; $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<span class="\"current\"">$counter</span>";
                else
                    $pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";                 
            }
        }
        elseif($lastpage > 5 + ($adjacents * 2))    //enough pages to hide some
        {
            //close to beginning; only hide later pages
            if($page < 1 + ($adjacents * 2))        
            {
                for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<span class="\"current\"">$counter</span>";
                    else
                        $pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";                 
                }
                $pagination.= "...";
                $pagination.= "<a href="\"diggstyle.php?page=$lpm1\"">$lpm1</a>";
                $pagination.= "<a href="\"diggstyle.php?page=$lastpage\"">$lastpage</a>";       
            }
            //in middle; hide some front and some back
            elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
            {
                $pagination.= "<a href="\"diggstyle.php?page=1\"">1</a>";
                $pagination.= "<a href="\"diggstyle.php?page=2\"">2</a>";
                $pagination.= "...";
                for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<span class="\"current\"">$counter</span>";
                    else
                        $pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";                 
                }
                $pagination.= "...";
                $pagination.= "<a href="\"diggstyle.php?page=$lpm1\"">$lpm1</a>";
                $pagination.= "<a href="\"diggstyle.php?page=$lastpage\"">$lastpage</a>";       
            }
            //close to end; only hide early pages
            else
            {
                $pagination.= "<a href="\"diggstyle.php?page=1\"">1</a>";
                $pagination.= "<a href="\"diggstyle.php?page=2\"">2</a>";
                $pagination.= "...";
                for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<span class="\"current\"">$counter</span>";
                    else
                        $pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";                 
                }
            }
        }

        //next button
        if ($page < $counter - 1) 
            $pagination.= "<a href="\"diggstyle.php?page=$next\"">next »</a>";
        else
            $pagination.= "<span class="\"disabled\"">next »</span>";
        $pagination.= "</div>\n";       
    }
?>
<ul>
    <?php
        while($item = mysql_fetch_array($portfolio))
        {
    ?>
        <li><a href="/web/20080709045706/http://www.strangerstudios.com/portfolio//"></a></li>
    <?php
        }
    ?>
</ul>
<?=$pagination?>

Autres conseils

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

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));

Résultat ( @ 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));

Résultat ( @ Codepad ):

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

J'ai commencé par le billet de lazaro et j'ai essayé de créer un algorithme robuste et léger avec javascript / jquery ... Aucune bibliothèque de pagination supplémentaire et / ou volumineuse nécessaire ... Regardez fiddle pour un exemple en direct: 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> ');
}

J'ai créé un cours de pagination et mis sur Google Code il y a quelque temps. Regardez c'est 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();
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;

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 chaque 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 maintenant

Restez simple:)

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 la suivante:

$("#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:';
                }
        }
});

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

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

$config['num_links'] = 2;
  

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top