laravel5自定义分页

简介:

laravel5分页处理与laravel4略有区别,laravel5提供了更方便的处理方式,可以方便满足不同分页展示。


laravel4自定义分页:http://php2012web.blog.51cto.com/5585213/1539601



laravel分页处理有分两个入口,即两个处理对象:

DB操作分页       Illuminate\Database\Query\Builder       

ORM操作分页   Illuminate\Database\Eloquent\Builder  



DB操作分页代码:


标准分页展示:  上一页  页号  下一页

wKiom1fo1DnAeAkgAAPdcD8ga-M618.jpg


简单分页展示:  上一页  下一页

wKiom1fo1DuwSt3sAANPxGjeTbc976.jpg


ORM操作分页代码:

标准分页展示:  上一页  页号  下一页


wKiom1fo1jGBAKbYAAPHuCUnrgw056.jpg


简单分页展示:  上一页  下一页

wKioL1fo1jOhEK6iAAOZc88PSLQ484.jpg


从代码中可以看出,分页会返回两种分页处理对象:

简单分页   Illuminate\Pagination\Paginator

标准分页   Illuminate\Pagination\LengthAwarePaginator


这两个对象都继承于  Illuminate\Pagination\AbstractPaginator


文档中也说明了分页展示调用方法:

1
{!! $paginator ->render()!!}


可以查看下 render  函数的处理代码:

标准分页展示:  上一页  页号  下一页

wKioL1fo2SjjkRHkAAJcqDRjOpI858.jpg


简单分页展示:  上一页  下一页

wKiom1fo2Sjjumt9AAJyChcfoek341.jpg


到这里可以看出,分页展示有三种方式处理:

  1. 给render追加自定义继承于Illuminate\Contracts\Pagination\Presenter的对象。

  2. 使用框架默认对象,即不传参数,有自定义需求可修改对应展示对象。

  3. 添加全局$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()!!}

本文转自  ttlxihuan    51CTO博客,原文链接:http://blog.51cto.com/php2012web/1856687

相关文章
|
6月前
|
前端开发
bladex自定义分页
bladex自定义分页
|
6月前
|
前端开发 JavaScript
vue实现通用分页控件,支持前端分页、后端分页。
vue实现通用分页控件,支持前端分页、后端分页。
86 1
|
前端开发 API 数据安全/隐私保护
DRF--分页
DRF--分页
|
6月前
|
PHP
thinkphp修改分页配置文件
thinkphp修改分页配置文件
36 0
|
6月前
|
前端开发
若依框架---分页功能
若依框架---分页功能
441 0
|
PHP
PHP:laravel自定义分页page查询方法
PHP:laravel自定义分页page查询方法
110 0
|
前端开发 PHP
Laravel 8 新特性:Artisan serve 改进、Tailwind 分页视图、路由命名空间更新
Laravel 8 通过引入 Laravel Jetstream,模型工厂类,迁移压缩,队列批处理,改善速率限制,队列改进,动态 Blade 组件,Tailwind 分页视图, 时间测试助手,artisan serve 的改进,事件监听器的改进,以及各种其他错误修复和可用性改进,对 Laravel 7.x 继续进行了改善。
207 0
|
前端开发 PHP
Laravel8 分页样式问题
一、问题:分页样式只显示上一页和下一页,中间的页码不显示
|
前端开发 PHP

相关实验场景

更多