[Laravel 5.3 新功能] 8. 自定义分页模板

说明

此文章是 [Laravel 5.3 新功能] 系列的第八篇文章,自定义分页模板。

[Laravel 5.3 新功能] 系列完整文章列表请见:分享:[Laravel 5.3 新功能] 系列文章

Laravel 分页

「分页」在开发中是一种经常用到的逻辑,通常工作量巨大。以前 Laravel 提供了非常便捷实用的分页模板,但从 5.0 开始,为了能让分页模板在非 Laravel 框架中使用,它不得不变得臃肿和复杂。不过从 5.3 开始,分页将变得更轻量化。

Laravel 中分页如何工作

下面我们通过一个简单的实例让你快速了解 Laravel 的分页机制:

// routes file
Route::get('tasks', function () {
    return view('tasks.index')
        ->with('tasks', Task::paginate(10));
});
// resource/views/tasks/index.blade.php
@foreach ($tasks as $task)
    <!-- echo the task or whatever -->
@endforeach
{{ $tasks->links() }}

默认情况下,Eloquent 的 paginate() 方法会读取请求中的查询参数来判断你当前所在的页面是第几页,所以在本例中,程序将会读取 ?page 参数并获取 10 条记录,最后在页面中通过遍历 $tasks 对象渲染数据。

如果你是通过 paginate() 方法获取这 10 条记录而不是使用 all() 方法,就可以在 $tasks 对象上调用一个新方法 links(),该方法会返回分页的 HTML 代码:

<ul class="pagination">
    <li class="disabled"><span>«</span></li>

    <li class="active"><span>1</span></li>
    <li><a href="http://53pagination.dev?page=2">2</a></li>
    <li><a href="http://53pagination.dev?page=3">3</a></li>

    <li><a href="http://53pagination.dev?page=2" rel="next">»</a></li>
</ul>

在 Laravel 5.3 中自定义分页模板

我们如何在 5.3 中自定义上文的分页模板?

默认情况下,分页模板可以在 Illuminate\Pagination 组件中找到:resources/views/bootstrap-3.blade.php,即:

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

    <!-- Pagination Elements -->
    @foreach ($elements as $element)
        <!-- "Three Dots" Separator -->
        @if (is_string($element))
            <li class="disabled"><span>{{ $element }}</span></li>
        @endif

        <!-- Array Of Links -->
        @if (is_array($element))
            @foreach ($element as $page => $url)
                @if ($page == $paginator->currentPage())
                    <li class="active"><span>{{ $page }}</span></li>
                @else
                    <li><a href="{{ $url }}">{{ $page }}</a></li>
                @endif
            @endforeach
        @endif
    @endforeach

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

如果你想要自定义这个分页,有两个选项:

  1. 发布内置的视图模板并进行编辑;
  2. 创建一个新的文件并手动将分页器链接到这个文件。

发布文件

最简单的方式就是运行 php artisan vendor:publish 命令,这将把模板发布到 vendor/pagination 目录里,然后你就可以在这里编辑它。这是最佳方式,除非你有一些特定的自定义需求,否则我推荐你这样使用。

手动链接文件

如果你选择创建一个新的分页文件并手动链接它,复制一份默认的分页模板然后按照自己的需求对文件进行修改,然后将其保存在 resources/views ,现在我们来使用 resources/views/partials/pagination.blade.php

在服务提供者的 boot()方法中运行 \Illuminate\Pagination\LengthAwarePaginator::defaultView('partials.paginator') ,用来注册新的分页模板。

注:如果你想要自定义使用指定的模板,可以传递视图名称到 links() 方法里: {{ $users->links('partials.paginator') }}

全文完。

链接

本帖已被设为精华帖!
本帖由系统于 7年前 自动加精
monkey
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

这个自定义的模板 是必须要先在服务提供者的 boot()方法中运行 么 还是说我自己定义一个模板,然后links()中传过去就可以了?

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!