Вопрос

<< 1 2 3 4 ... 15 16 17 ... 47 48 49 50 >>

<< 1 2 3 4 5 6 7 ... 47 48 49 50 >>

<< 1 2 3 4 ... 44 45 46 47 48 49 50 >>

(жирным шрифтом выделена выбранная страница)

Есть ли какая-нибудь логика скалывателя, которая создает такое масштабируемое разбиение на страницы?Я уже создавал один из них, но в итоге он превратился в путаницу логических утверждений.

Язык, на котором я сейчас это делаю, — PHP, но если у вас есть примеры или советы для любого языка, мы будем признательны.

Под масштабированием я имею в виду ситуацию, когда страниц всего несколько.Пагинация отображает это.

<< 1 2 3 4 5 6 7 >>

По мере того, как количество страниц достигает определенной точки, нумерация страниц перестает отображать все числа и начинает их разделять.

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

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

<< 1 2 3 4 5 6 7 8 ... 47 48 49 50 >>

<< 1 2 3 4 .. 7 8 9 ... 47 48 49 50 >>

<< 1 2 3 4 .. 15 16 17 ... 47 48 49 50 >>

<< 1 2 3 4 ... 44 45 46 47 48 49 50 >>

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

(обратите внимание, фактические цифры и количество показаний до и после не имеют значения)

Это было полезно?

Решение

Извините за кусок кода, но вот.Надеюсь, комментариев будет достаточно, чтобы рассказать вам, как это работает. Если вы оставите комментарий, я, возможно, добавлю еще.

    /**
     * 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);
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top