限制使用Laravel分页显示的链接数量

时间:2014-12-26 10:40:09

标签: php laravel pagination

使用Laravels分页限制显示链接数量的任何简单方法都可用吗?

目前最多显示13个链接(上一个,1 2 3 4 5 7 8 .. 78 79下一个)

然而,这对于移动设备来说太多了,并且变成了双线导航...有没有办法将链接设置为例如只显示10?

我和分页主持人搞混了,但实际上似乎没什么用。

由于

12 个答案:

答案 0 :(得分:5)

我创建了一个新的自定义演示者,只显示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),放在视图文件夹中

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

更新 app / config.view.php

'pagination' => 'custom-paginator',

通过进行以下更改,您将能够获得10个链接分页器。

希望这有帮助:D

答案 1 :(得分:4)

From laravel 8 docs。如果需要,您可以使用刀片中的 onEachSide 方法控制当前页面每一侧显示的附加链接数量:

{{ $posts->onEachSide(1)->links() }}

答案 2 :(得分:2)

我知道这是一个老问题,但仍无法使用函数links()参数设置。我制作了简单的jQuery代码,也许它会帮助别人。它比Zesky的答案简单得多。我不是更好,只是更简单:)

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's 560px */) {
    ul.pagination li:not(.show-mobile) {
        display: none;
    }
}

此代码仅显示少量li元素。有效,两个前,后两个,上一个/下一个箭头。这最多只能生成7个可见元素,而不是15个。

答案 3 :(得分:2)

根据您的行为方式,有很多方法可以解决这个问题。

根据我的需要,我想要一个快速的解决方案来缩短它,这样就不会破坏我的移动布局。

Laravel 5.3

编辑此文件:(或您在分页器调用中使用的文件)

@inject

我在2个链接之后添加了一行来突破链接渲染循环。

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

答案 4 :(得分:2)

对于Laravel 5.6 +

发布供应商模板:

factory_id=1
order_products[0][product_id]=1
order_products[0][quantity]=10
order_products[0][size_id]=1
order_products[1][product_id]=1
order_products[1][quantity]=10
order_products[1][size_id]=2
order_products[2][product_id]=2
order_products[2][quantity]=10
order_products[2][size_id]=1
order_products[3][product_id]=2
order_products[3][quantity]=10
order_products[3][size_id]=2
order_products[4][product_id]=3
order_products[4][quantity]=15
order_products[4][size_id]=1
order_products[5][product_id]=3
order_products[5][quantity]=20
order_products[5][size_id]=2
order_products[6][product_id]=4
order_products[6][quantity]=10

按以下步骤编辑php artisan vendor:publish --tag=laravel-pagination

bootstrap-4.blade.php

此示例以正确的方式正确处理了新的CSS类,活动链接,三个点(正确地不是1..2 3 4),并且可以自定义(您要显示的页面数)。

Example

Three dots handled correctly

答案 5 :(得分:1)

定义自定义演示者的旧方法不适用于Laravel 5.3+,显示的链接数似乎在$onEachSide的{​​{1}}参数中进行了硬编码:

Illuminate/Pagination/UrlWindow::make()

我最后只编写了自己的render()函数,窃取了public static function make(PaginatorContract $paginator, $onEachSide = 3)

中的一些代码
LengthAwarePaginator

}

我们使用Twig,所以我将其注册为Twig过滤器,我想可以为Blade做类似的事情。

答案 6 :(得分:1)

我的表太窄了,所以我决定只显示jQuery filter()的第一个和最后一个li(下一个和后一个箭头)。您可以进一步自定义。

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

确保在身体标记结束之前添加它。

答案 7 :(得分:1)

这是一个老问题,但只是想我分享我最近如何减少 Laravel 5.2 应用程序中的分页链接数量:

ViewServiceProvider内:

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

应用\分页\ 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);
    }
}

自:

enter image description here

要:

enter image description here

答案 8 :(得分:1)

使用以下代码在视图文件夹中的新分页文件夹中创建一个文件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 :(得分:1)

这是一个较旧的问题,但是最新的Laravel文档中没有最新的答案。对于较新版本的Laravel(Laravel 5.6+),此问题有些容易解决,但确实需要按照Laravel Documentation发布供应商分页视图。假设您尚未发布或更改默认的分页视图,则运行的命令是:

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

一旦视图发布,您将在resources / views / vendor / pagination目录中找到bootstrap-4.blade.php。您可以编辑该文件,并根据需要显示分页链接。为了减少默认情况下显示的链接数,我只使用了一些内联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发布了类似的答案,但是它不包括发布之前发布供应商文件的整个过程。希望这对其他人有帮助。

答案 10 :(得分:1)

现在,Laravel 5.7具有新的分页方法,可自定义分页器两侧的链接数量。由于有了新方法,在某些情况下您不再需要自定义分页视图。您可以使用以下API在当前页面的每一侧定义链接计数:

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

在控制器上编写该代码。

您可以在https://laravel-news.com/laravel-5-7-pagination-link-customizations

查看更多详细信息

答案 11 :(得分:1)

我使用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;
    }
}

此特定实现允许箭头,“ ...”,第一页,活动页和最后一页