Pregunta

  

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

(la negrita es la página seleccionada)

¿Existe alguna lógica de corte que cree una paginación de escala como esta? He creado uno de estos antes, pero terminó como un desastre de declaraciones lógicas.

El lenguaje en el que estoy haciendo esto ahora es PHP, pero si tiene ejemplos o sugerencias para cualquier idioma, se lo agradeceríamos.

Al escalar me refiero a cuando solo hay unas pocas páginas. La paginación muestra esto.

  

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

A medida que el número de páginas crece hasta cierto punto, la paginación deja de mostrar todos los números y comienza a dividirlos.

  

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

(tenga en cuenta que los números reales y cuántos muestra antes y después no son relevantes)

¿Fue útil?

Solución

Perdón por el blob de código pero aquí va. Esperemos que los comentarios sean suficientes para decirle cómo funciona: si deja un comentario y podría agregar algo más.

    /**
     * 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);
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top