Question

  

< < 1 2 3 4 ... 15 16 17 ... 47 48 49 50 & Gt; & Gt;

     

< < 1 2 3 4 5 6 7 ... 47 48 49 50 & Gt; & Gt;

     

< < 1 2 3 4 ... 44 45 46 47 48 49 50 & Gt; & Gt;

(le gras est la page sélectionnée)

Existe-t-il une logique de couperet qui crée une pagination de redimensionnement comme celle-ci? J'en ai créé un auparavant, mais cela a abouti à un gâchis d'énoncés logiques.

La langue dans laquelle je fais cela actuellement est PHP, mais si vous avez des exemples ou des conseils pour n’importe quelle langue, nous vous en serions reconnaissants.

Par graduation, je veux dire quand il n’ya que quelques pages. La pagination l’affiche.

  

< < 1 2 3 4 5 6 7 & Gt; & Gt;

À mesure que le nombre de pages augmente jusqu'à un certain point, la pagination cesse d'afficher tous les nombres et commence à les séparer.

  

< < 1 2 3 4 ... 47 48 49 50 > >

     

< < 1 2 3 4 5 6 ... 47 48 49 50 & Gt; & Gt;

     

< < 1 2 3 4 5 6 7 8 ... 47 48 49 50 & Gt; & Gt;

     

< < 1 2 3 4 .. 7 8 9 ... 47 48 49 50 & Gt; & Gt;

     

< < 1 2 3 4 .. 15 16 17 ... 47 48 49 50 & Gt; & Gt;

     

< < 1 2 3 4 ... 44 45 46 47 48 49 50 & Gt; & Gt;

     

< < 1 2 3 4 ... 47 48 49 50 & Gt; & Gt;

(remarque: les chiffres réels et le nombre indiqué avant et après ne sont pas pertinents)

Était-ce utile?

La solution

Désolé pour le blob de code, mais voilà. Espérons que les commentaires suffiront pour vous expliquer comment cela fonctionne - si vous laissez un commentaire et que je pourrais en ajouter d'autres.

    /**
     * Get a spread of pages, for when there are too many to list in a single <select>
     * Adapted from phpMyAdmin common.lib.php PMA_pageselector function
     *
     * @param integer total number of items
     * @param integer the current page
     * @param integer the total number of pages
     * @param integer the number of pages below which all pages should be listed
     * @param integer the number of pages to show at the start
     * @param integer the number of pages to show at the end
     * @param integer how often to show pages, as a percentage
     * @param integer the number to show around the current page
     */
    protected function pages($rows, $pageNow = 1, $nbTotalPage = 1, $showAll = 200, $sliceStart = 5, $sliceEnd = 5, $percent = 20, $range = 10)
    {
        if ($nbTotalPage < $showAll)
            return range(1, $nbTotalPage);

        // Always show the first $sliceStart pages
        $pages = range(1, $sliceStart);

        // Always show last $sliceStart pages
        for ($i = $nbTotalPage - $sliceEnd; $i <= $nbTotalPage; $i++)
            $pages[] = $i;

        $i = $sliceStart;
        $x = $nbTotalPage - $sliceEnd;
        $met_boundary = false;
        while ($i <= $x)
        {
            if ($i >= ($pageNow - $range) && $i <= ($pageNow + $range))
            {
                // If our pageselector comes near the current page, we use 1
                // counter increments
                $i++;
                $met_boundary = true;
            }
            else
            {
                // We add the percentate increment to our current page to
                // hop to the next one in range
                $i = $i + floor($nbTotalPage / $percent);

                // Make sure that we do not cross our boundaries.
                if ($i > ($pageNow - $range) && !$met_boundary)
                  $i = $pageNow - $range;
            }

            if ($i > 0 && $i <= $x)
                $pages[] = $i;
        }

        // Since because of ellipsing of the current page some numbers may be double,
        // we unify our array:
        sort($pages);
        return array_unique($pages);
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top