Подтвердить что ты не робот

Ограничить количество ссылок, показанных с разбиением на страницы Laravel

Любой простой способ ограничить, сколько ссылок показано с разбивкой по страницам Laravels?

В настоящее время он показывает не более 13 ссылок (Prev, 1 2 3 4 5 7 8.. 78 79 следующий)

Однако это слишком много для мобильных устройств и становится двухлинейной навигацией... есть ли способ установить ссылки, например. только показать 10?

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

Спасибо

4b9b3361

Ответ 1

Старый способ определения пользовательского презентатора не работает с Laravel 5.3+, количество отображаемых ссылок кажется жестко закодированным в параметре $onEachSide Illuminate/Pagination/UrlWindow::make():

public static function make(PaginatorContract $paginator, $onEachSide = 3)

В итоге я просто написал свою собственную функцию render(), украв какой-то код из LengthAwarePaginator

/**
 * Stole come code from LengthAwarePaginator::render() and ::elements() to allow for a smaller UrlWindow
 *
 * @param LengthAwarePaginator $paginator
 * @param int $onEachSide
 * @return string
 */
public static function render(LengthAwarePaginator $paginator, $onEachSide = 2)
{
    $window = UrlWindow::make($paginator, $onEachSide);

    $elements = array_filter([
        $window['first'],
        is_array($window['slider']) ? '...' : null,
        $window['slider'],
        is_array($window['last']) ? '...' : null,
        $window['last'],
    ]);

    return LengthAwarePaginator::viewFactory()->make(LengthAwarePaginator::$defaultView, [
        'paginator' => $paginator,
        'elements' => $elements,
    ])->render();
}

}

Мы используем Twig, поэтому я зарегистрировал это как фильтр Twig, я предполагаю, что для Blade можно сделать что-то подобное.

Ответ 2

Я создал новый пользовательский презентатор, чтобы показать только 10 ссылок. Он включает в себя 3 этапа:

Создайте собственный пользовательский презентатор

use Illuminate\Pagination\BootstrapPresenter;

class CustomPresenter extends BootstrapPresenter{
    protected function getPageSlider()
    {
        // Changing the original value from 6 to 3 to reduce the link count
        $window = 3;

        // If the current page is very close to the beginning of the page range, we will
        // just render the beginning of the page range, followed by the last 2 of the
        // links in this list, since we will not have room to create a full slider.
        if ($this->currentPage <= $window)
        {
            $ending = $this->getFinish();

            return $this->getPageRange(1, $window + 2).$ending;
        }

        // If the current page is close to the ending of the page range we will just get
        // this first couple pages, followed by a larger window of these ending pages
        // since we're too close to the end of the list to create a full on slider.
        elseif ($this->currentPage >= $this->lastPage - $window)
        {
            $start = $this->lastPage - 8;

            $content = $this->getPageRange($start, $this->lastPage);

            return $this->getStart().$content;
        }

        // If we have enough room on both sides of the current page to build a slider we
        // will surround it with both the beginning and ending caps, with this window
        // of pages in the middle providing a Google style sliding paginator setup.
        else
        {
            $content = $this->getAdjacentRange();

            return $this->getStart().$content.$this->getFinish();
        }
    }

} 

Создайте свой собственный просмотр страниц (например, custom-paginator.php), поместите в папку views

<ul class="pagination">
    <?php echo with(new CustomPresenter($paginator))->render(); ?>
</ul>

Обновите приложение /config.view.php

'pagination' => 'custom-paginator',

Сделав следующие изменения, вы сможете получить 10 ссылок на страницы.

Надеюсь, что эта помощь: D

Ответ 3

Я знаю, это старый вопрос, но до сих пор нет возможности установить параметры функции links(). Я сделал простой код jQuery, возможно, это поможет кому-то. Это намного проще, чем ответ Зески. Я не имею в виду лучше, просто проще:)

JavaScript:

(function($) {
    $('ul.pagination li.active')
        .prev().addClass('show-mobile')
        .prev().addClass('show-mobile');
    $('ul.pagination li.active')
        .next().addClass('show-mobile')
        .next().addClass('show-mobile');
    $('ul.pagination')
        .find('li:first-child, li:last-child, li.active')
        .addClass('show-mobile');
})(jQuery);

CSS

@media (max-width: /* write what you need, for me it 560px */) {
    ul.pagination li:not(.show-mobile) {
        display: none;
    }
}

Этот код отображает только несколько элементов li. Активен, два перед, два после, предыдущие/следующие стрелки. Это делает только 7 видимых элементов больше, чем 15.

Ответ 4

Есть много способов сделать это в зависимости от того, как именно вы хотите, чтобы он вел себя.

Для моих нужд я хотел быстрое решение, чтобы сократить его, чтобы оно не нарушало мои мобильные макеты.

Ларавел 5.3

Отредактируйте этот файл: (или тот, который вы используете в своих вызовах paginator)

/vendor/pagination/bootstrap-4.blade.php

Я добавляю одну строку, чтобы выйти из цикла рендеринга ссылок после 2 ссылок.

{{-- Array Of Links --}}
    @if (is_array($element))
        @foreach ($element as $page => $url)
             @if ($page == $paginator->currentPage())
                 <li class="page-item active"><span class="page-link">{{ $page }}</span></li>
              @else
                  <li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
                  {{--Add the line below to limit rendered links--}}
                  <?php if($loop->count > 2) break; ?>
              @endif
         @endforeach
     @endif

Ответ 5

Для Laravel 5. 6+

Опубликовать шаблон поставщика:

php artisan vendor:publish --tag=laravel-pagination

Отредактируйте bootstrap-4.blade.php следующим образом:

@if ($paginator->hasPages())
<ul class="pagination" role="navigation">
    {{-- Previous Page Link --}}
    @if ($paginator->onFirstPage())
        <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
            <span class="page-link" aria-hidden="true">&lsaquo;</span>
        </li>
    @else
        <li class="page-item">
            <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
        </li>
    @endif

    <?php
        $start = $paginator->currentPage() - 2; // show 3 pagination links before current
        $end = $paginator->currentPage() + 2; // show 3 pagination links after current
        if($start < 1) {
            $start = 1; // reset start to 1
            $end += 1;
        } 
        if($end >= $paginator->lastPage() ) $end = $paginator->lastPage(); // reset end to last page
    ?>

    @if($start > 1)
        <li class="page-item">
            <a class="page-link" href="{{ $paginator->url(1) }}">{{1}}</a>
        </li>
        @if($paginator->currentPage() != 4)
            {{-- "Three Dots" Separator --}}
            <li class="page-item disabled" aria-disabled="true"><span class="page-link">...</span></li>
        @endif
    @endif
        @for ($i = $start; $i <= $end; $i++)
            <li class="page-item {{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
                <a class="page-link" href="{{ $paginator->url($i) }}">{{$i}}</a>
            </li>
        @endfor
    @if($end < $paginator->lastPage())
        @if($paginator->currentPage() + 3 != $paginator->lastPage())
            {{-- "Three Dots" Separator --}}
            <li class="page-item disabled" aria-disabled="true"><span class="page-link">...</span></li>
        @endif
        <li class="page-item">
            <a class="page-link" href="{{ $paginator->url($paginator->lastPage()) }}">{{$paginator->lastPage()}}</a>
        </li>
    @endif

    {{-- Next Page Link --}}
    @if ($paginator->hasMorePages())
        <li class="page-item">
            <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
        </li>
    @else
        <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
            <span class="page-link" aria-hidden="true">&rsaquo;</span>
        </li>
    @endif
</ul>
@endif

Этот пример корректно обрабатывает новые классы CSS, активную ссылку, три точки (правильно, а не 1..2 3 4) и настраивается ли он (количество страниц, которые вы хотите показать).

пример

Три точки обрабатываются правильно

Ответ 6

Моя таблица была слишком узкой, поэтому я решил показать только первую и последнюю ли (стрелки Next и Back) разбивки на страницы с помощью jQuery filter(). Вы можете настроить это далее.

$('ul.pagination li').hide().filter(':lt(1), :nth-last-child(1)').show();

Обязательно добавьте его до конца тега тела.

Ответ 7

Это старый вопрос, но я подумал, что поделился бы тем, как я недавно добился сокращения количества ссылок на страницы в приложении Laravel 5.2:

Внутри ViewServiceProvider:

 \Illuminate\Pagination\AbstractPaginator::presenter(function($paginator) {
      return new \App\Pagination\BootstrapPresenter($paginator);
 });

App\Разбивка\BootstrapPresenter.php

<?php namespace App\Pagination;

use Illuminate\Pagination\UrlWindow;
use Illuminate\Contracts\Pagination\Paginator as PaginatorContract;
use Illuminate\Pagination\BootstrapThreePresenter as LaravelBootstrapThreePresenter;

class BootstrapPresenter extends LaravelBootstrapThreePresenter
{
    /**
     * Create a new Bootstrap presenter instance.
     *
     * @param  \Illuminate\Contracts\Pagination\Paginator  $paginator
     * @param  \Illuminate\Pagination\UrlWindow|null  $window
     * @return void
     */
    public function __construct(PaginatorContract $paginator, UrlWindow $window = null)
    {
        $this->paginator = $paginator;

        // Make the pagination window smaller (default is 3).
        $this->window = UrlWindow::make($paginator, 1);
    }
}

From:

введите описание изображения здесь

To:

введите описание изображения здесь

Ответ 8

Создайте один файл default.blade.php в новой папке пагинации в папке просмотра с кодом ниже. Это означает, что вы изменили файл пагинации ядра с помощью нашего нового файла пагинации. Это установит некоторый предел в ссылке на страницы.

@if ($paginator->hasPages())
    <ul class="pagination pagination">
        {{-- Previous Page Link --}}
        @if ($paginator->onFirstPage())
            <li class="disabled"><span>«</span></li>
        @else
            <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
        @endif

        @if($paginator->currentPage() > 3)
            <li class="hidden-xs"><a href="{{ $paginator->url(1) }}">1</a></li>
        @endif
        @if($paginator->currentPage() > 4)
            <li><span>...</span></li>
        @endif
        @foreach(range(1, $paginator->lastPage()) as $i)
            @if($i >= $paginator->currentPage() - 2 && $i <= $paginator->currentPage() + 2)
                @if ($i == $paginator->currentPage())
                    <li class="active"><span>{{ $i }}</span></li>
                @else
                    <li><a href="{{ $paginator->url($i) }}">{{ $i }}</a></li>
                @endif
            @endif
        @endforeach
        @if($paginator->currentPage() < $paginator->lastPage() - 3)
            <li><span>...</span></li>
        @endif
        @if($paginator->currentPage() < $paginator->lastPage() - 2)
            <li class="hidden-xs"><a href="{{ $paginator->url($paginator->lastPage()) }}">{{ $paginator->lastPage() }}</a></li>
        @endif

        {{-- Next Page Link --}}
        @if ($paginator->hasMorePages())
            <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li>
        @else
            <li class="disabled"><span>»</span></li>
        @endif
    </ul>
@endif

Затем, где вы хотите получить нумерацию страниц, вы должны вызвать функцию пагинации laravel с этим параметром файла представления.

 $data->links('pagination.default')

Ответ 9

Теперь в Laravel 5.7 появился новый метод разбиения на страницы, чтобы настроить количество ссылок на каждой стороне пагинатора. Благодаря новому методу в некоторых случаях вам больше не нужен настраиваемый вид нумерации страниц. Вот API, который вы можете использовать для определения количества ссылок на каждой стороне текущей страницы:

User::paginate(10)->onEachSide(2);

напишите этот код на вашем контроллере.

вы можете увидеть более подробную информацию на https://laravel-news.com/laravel-5-7-pagination-link-customizations

Ответ 10

Это более старый вопрос, но ни один из ответов не соответствует последней документации Laravel. В более новых версиях Laravel (Laravel 5. 6+) эта проблема может быть несколько легко решена, но для этого необходимо опубликовать представления разбиения на страницы поставщика в соответствии с документацией Laravel. Предполагая, что вы еще не опубликовали или не изменили представление разбиения на страницы по умолчанию, вы выполните следующую команду:

php artisan vendor:publish --tag=laravel-pagination

Как только представления будут опубликованы, вы найдете bootstrap-4.blade.php в каталоге resources/views/vendor/pagination. Вы можете отредактировать этот файл и сделать так, чтобы ссылки на страницы отображались так, как вы хотите. Чтобы уменьшить количество ссылок, отображаемых по умолчанию, я просто использовал немного встроенного php, чтобы установить индекс и ограничить количество отображаемых ссылок, как показано ниже:

{{-- Array Of Links --}}
@if (is_array($element))
    <?php $index = 0; ?>
    @foreach ($element as $page => $url)
        @if($index<4)
            @if ($page == $paginator->currentPage())
                <li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
            @else
                <li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
            @endif
        @endif
        <?php $index++ ?>
    @endforeach
@endif

Большая часть этого кода находится в блейд-представлении по умолчанию для bootstrap-4.blade.php, но я добавил код $ index = 0, $ index <4, $index++, чтобы ОГРАНИЧИТЬ число ссылок в левой части страницы до 4.

Это правильный способ решения этой проблемы в соответствии с документацией Laravel, без редактирования файлов вендора компоновщика или попытки взлома системы каким-либо другим способом. Я понимаю, что JR Lawhorne опубликовал аналогичный ответ, но он не включает весь процесс публикации файла поставщика перед публикацией. Надеюсь, что это помогает другим.

Ответ 11

Я использовал css, чтобы ограничить ссылки, которые я позволил. Действительно просто.. это может быть расширено, чтобы показать любое количество страниц при любом количестве точек останова

@media screen and ( max-width: 400px ){

    li.page-item {

        display: none;
    }

    .page-item:first-child,
    .page-item:nth-child( 2 ),
    .page-item:nth-last-child( 2 ),
    .page-item:last-child,
    .page-item.active,
    .page-item.disabled {

        display: block;
    }
}

эта конкретная реализация допускает стрелки, "...", первую страницу, активную страницу и последнюю страницу