本文共 3865 字,大约阅读时间需要 12 分钟。
laravel5分页处理与laravel4略有区别,laravel5提供了更方便的处理方式,可以方便满足不同分页展示。
laravel4自定义分页:
laravel分页处理有分两个入口,即两个处理对象:
DB操作分页 Illuminate\Database\Query\Builder
ORM操作分页 Illuminate\Database\Eloquent\Builder
DB操作分页代码:
标准分页展示: 上一页 页号 下一页
简单分页展示: 上一页 下一页
ORM操作分页代码:
标准分页展示: 上一页 页号 下一页
简单分页展示: 上一页 下一页
从代码中可以看出,分页会返回两种分页处理对象:
简单分页 Illuminate\Pagination\Paginator
标准分页 Illuminate\Pagination\LengthAwarePaginator
这两个对象都继承于 Illuminate\Pagination\AbstractPaginator
文档中也说明了分页展示调用方法:
1 | {!! $paginator ->render()!!} |
可以查看下 render 函数的处理代码:
标准分页展示: 上一页 页号 下一页
简单分页展示: 上一页 下一页
到这里可以看出,分页展示有三种方式处理:
给render追加自定义继承于Illuminate\Contracts\Pagination\Presenter的对象。
使用框架默认对象,即不传参数,有自定义需求可修改对应展示对象。
添加全局$presenterResolver静态处理回调。
从通用性来看,第1和第3是可以随意扩展,第2条却不得不去修改框架代码,以获取自定义需求。
第1条处理方式 需要自己写分页展示处理对象,可以直接继承于框架预设的两个对象:
简单分页 Illuminate\Pagination\Paginator
标准分页 Illuminate\Pagination\LengthAwarePaginator
覆盖相关函数即可实现自定义。
或者自定对象中直接操作视图:
定义处理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* * 自定义分页处理 */ use Illuminate\Contracts\Pagination\Paginator as PaginatorContract; class Page implements Illuminate\Contracts\Pagination\Presenter { //分页对象 protected $paginator ; //分页展示视图 protected $view ; //初始化处理 public function __construct(PaginatorContract $paginator , $view ) { $this ->paginator = $paginator ; $this ->view = $view ; } //是否可以够分页 public function hasPages() { return $this ->paginator->hasPages(); } /* * 分页展示处理 */ public function render() { return view( $this ->view, [ 'paginator' => $this ->paginator]); } } |
分页视图,保存文件名:page.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <? php $size = 10; //页号显示个数 ?> < div > < span >共< b >{ {$paginator->total()}}</ b >记录/行数< b >{ {$paginator->perPage()}}</ b >/分< b >{ {$paginator->lastPage()}}</ b >页</ span > @if($paginator->lastPage()>1) < ul class = "pagination" > < li class="prev<?php if ($paginator->currentPage() == 1) { ?> disabled<? php } ?>">< a href="{ {$paginator->url(1)}}">首页</ a ></ li > < li <?php if ($paginator->currentPage() == 1) { ?> class="disabled"<? php } ?>>< a href="{ {$paginator->previousPageUrl()}}">上一页</ a ></ li > @for($pageNum=max($paginator->currentPage()-$size/2,1),$length=0;$length<$size && $pageNum<=$paginator->lastPage();$length++,$pageNum++) @if($paginator->currentPage()==$pageNum) < li class = "disabled" >< a href = "javascript:void(0);" class = "current" >{ {$pageNum}}</ a ></ li > @else < li >< a href="{ {$paginator->url($pageNum)}}">{ {$pageNum}}</ a ></ li > @endif @endfor < li style = "margin-left: 10px;" > < input type = "text" value="{ {$paginator->currentPage()}}" size="3" onchange="this.value = Math.max(Math.min(parseInt(this.value.replace(/\D+/g, '')),'{ {$paginator->lastPage()}}'), 1)" style="width: 70px;display: inline-block;"/> < input type = "button" value = "转到" onclick="var text = this.previousSibling; while (text.nodeType != 1){text = text.previousSibling; }; text.onchange(); text.value != '{ {$paginator->currentPage()}}' && (location.href ='{ {$paginator->url(1)}}'.replace(/page=\d+/, 'page=' + text.value));"/> </ li > < li <?php if ($paginator->lastPage() == $paginator->currentPage()) { ?> class="disabled"<? php } ?>>< a href="{ {$paginator->nextPageUrl()}}">下一页</ a ></ li > < li class="next<?php if ($paginator->lastPage() == $paginator->currentPage()) { ?> disabled<? php } ?>">< a href="{ {$paginator->url($paginator->lastPage())}}">尾页</ a ></ li > </ ul > @endif </ div > |
视图调用
1 | {!! $paginator ->render( new Page( $paginator , 'page' ))!!} |
第3条处理方式 可以使用匿名函数或指定调用类与方法,只要能满足 call_user_func 方法的参数结构即可。
最方便的就是使用匿名函数可以直接省去第1条Page类可直接在 App\Http\Controllers\Controller 增加构造函数及代码:
1 2 3 4 5 6 | public function __construct() { //分页定义 Paginator::presenter( function ( $paginator ) { return view( 'page' , compact( 'paginator' )); }); } |
这样调用方法比第1条更方便:
1 | {!! $paginator ->render()!!} |
转载地址:http://wlkol.baihongyu.com/