手机版

Laravel5.5手动分页和自定义分页样式的简单实现

时间:2021-08-19 来源:互联网 编辑:宝哥软件园 浏览:

基于Laravel5.5在项目实施过程中,需要对从接口中获取的数据(或者通过搜索工具查询出来的数据)进行分页

一、创建手动分页

在laravel自带的分页中,一般是通过数据库查询访问paginate()方法来达到分页的效果,像这样:

类索引控制器扩展控制器

{ public function index(){ $ person=db : table(' person ')-paginate(15);返回视图(' index.pagTest ',[' person '=$ person]);}}查看框架的分页源代码

#供应商/laravel/框架/src/照明/数据库/雄辩/构建器。服务器端编程语言(Professional Hypertext Preprocessor的缩写)

/** *给定查询分页* * @ param int $ Perpage * @ param array $ columns * @ param string $ page name * @ param int | null $ page * @ return \ illumination \ Contracts \ Pagination \ lengttawarepagentator * * @抛出\ InvalidArgumentException */public function paginate($ perPage=null,$ columns=[' *],$pageName='page ',$page=null) { $page=$page?分页器:解析当前页面($ page name);$perPage=$perPage?美元-this-model-getPerPage();$ results=($ total=$ this-to base()-getcountforbegination())?$this-forPage($page,$ perPage)-get($ columns): $ this-model-new collection();返回$this-paginator($results,$total,$perPage,$page,[' path '=paginator : resolveecurrentpath(),' pageName'=$pageName,]);}发现,分页用了\照明\合同\分页\长度分页器构造方法,查看这个构造方法

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)命名空间照亮\分页;使用可数的使用arrayaccession使用JsonSerializable使用迭代聚合使用照明\支持\收藏;使用照亮\支持\ HtmlString使用照明\合同\支持\支持;使用照明\合同\支持\可安排;使用照明\合同\分页\长度分页器作为长度分页器合同;类length awarepagentator扩展了抽象分页器实现了Arrayable、arrayaccession、Countable、IteratorAggregate、JsonSerializable、Jsonable、length awarepagentract {/* * *切片前的项目总数* * @ var int */protected $ total;/** *最后一页* * @ var int */protected $ LastPage;/** *创建一个新的分页器实例* * @ param混合$ items * @ param int $ total * @ param int $ Perpage * @ param int | null $ CurrentPage * @ param array $ options(路径、查询、片段、页名)* @ return void */public function _ _ construct($ items,$ total,$ perPage,$currentPage=null,array $ options=[]){ foreach($ options as $ key=$ value){ $ this-{ $ key }=$ value;} $ this-total=$ total;$ this-perPage=$ perPage;$ this-LastPage=max((int)ceil($ total/$ PerpPage),1);$这个路径=$这个路径!=='/' ?rtrim($this-path,'/'): $ this-path;$ this-current page=$ this-set current page($ current page,$ this-page name);$ this-items=集合的$ items实例?$ items :集合:3360 make($ items);}如果要实现手动分页,只需要使用这个构造方法,给定参数,就能达到分页的效果

贴代码:

公共函数集2(请求$请求$数据$准备$总计){ 0

#每页显示记录$ prePage=$ prePage//$ total=count($ data);$ allitem=$ prepage * 100总计$allitem?$ total=$ allitem : $ total f(isset($ request-page)){ $ current _ page=int val($ request-page);$current_page=$current_page=0?1:美元current _ page } else { $ current _ page=1;} #url操作$url=$url='http://' .$_SERVER['SERVER_NAME'].$ _ SERVER[' REQUEST _ URI '];if(strpos($url,' page ')$ URL=str _ replace(' page=').$request-page ' ',$ URL);# $数据必须是array $item=array_slice($data,($current_page-1)*$prePage,$ prePage);$ paginator=new lengtawarepagerator($ item,$total,$prePage,$current_page,[ 'path'=$url,' page name '=' page ']);返回$ paginator}($data为需要进行分页的数据)

说明:

1、在考虑到代码的复用性,我将分页代码封装到应用/控制器/控制器中的一个方法里面,这样在其他控制器里只需要$this-setPage(请求$请求$数据$准备$总计)就能使用了,(前提:其他控制器继承了Controller.php)

2、分页的网址,因为我的项目的全球资源定位器(统一资源定位符)一定会携带一个千瓦参数,所以我直接用字符串替换替换页面,如果是存在不携参分页的话,需要判断,到底是?页面还是第五页。(网址的逻辑可以自己写)

#分页服务器端编程语言(专业超文本预处理器的缩写)

$ paginator=$ this-set page 2($ request,$data,25,$ sum);$ data=$ paginator-to array()[' data '];在模板中:{{$paginator-render()}}即能输出分页HTML,样式如下:

二、自定义分页样式

在实际开发中,不希望用户在浏览时直接浏览最后几页,只想用户从前往后依次的浏览,如百度搜索分页,这时候,就想修改分页的样式,经过一个下午的奋战,贴出解决过程

在上一环节中,手动创建了分页,了解超文本标记语言的模板生成是渲染()方法,

# \照明\合同\分页\长度分页器

/** *使用给定的视图呈现分页器* * @ param string | null $ view * @ param array $ data * @ return \ light \ Support \ html string */public function render($ view=null,$ data=[]){ return new html string(static : viewcfactory()-make($ view? static : $ DefaultView,array_merge($data,[ 'paginator'=$this,' elements'=$this-elements(),]))-render());}经过思考,我们不去改laravel框架的源代码,可以通过重构提出方法或者重新定义一个生成超文本标记语言模板的方法来实现自定义超文本标记语言模板

因为我们只需要自定义超文本标记语言模板,所以,可以创建一个文件,继承\照明\合同\分页\长度分页器类

看代码:

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)命名空间应用\助手使用照明\分页\长度分页器;/** *由PhpStorm创建*用户: 1 *日期: 2018/4/9 *时间: 9:08 */班级新页面扩展了长度awarepagentator { public $ de _ page=10;//默认显示分页数public $ pageHtmlpublic函数new render(){ if($ this-HasPages()){ return sprint f(' ul class=' paging ' % s % s/ul ',$this-pre_page(),$this-pages_num(),$ this-next _ page());} } #上一页public function pre _ page(){ if($ this-current page==1){//DD($ this-current page);return ' Li class=' disabled ' span 《/span/li"; }else{ $url = $this-path."page=".($this-currentPage-1); //dd($url); return "lia href=".$url." rel="external nofollow" rel='prev'《/a/li"; } } #页码 public function pages_num(){ $pages = ''; if($this-currentPage = 6){ for($i = 1; $i = $this-de_page; $i++){ if($this-currentPage == $i){ $pages .= "li class='active'a href=".$this-path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" page=".$i."".$i."/a/li"; }else{ $pages .="lia href=".$this-path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" page=".$i."".$i."/a/li"; } } }else{ #当前页前边部分 for($i = 5; $i =1 ; $i--){ $url =$this-currentPage-$i; $pages .= "lia href=".$this-path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" page=".$url."".$url."/a/li"; } #当前页 $pages .= "li class='active'span".$this-currentPage."/span/li"; #当前页后边部分 for($i = 1;$i 5; $i++ ){ $nowpage =$this-currentPage+$i; $pages .= "lia href=".$this-path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" page=".$nowpage."".$nowpage."/a/li"; } } return $pages; } #下一页 public function next_page(){ if($this-currentPage $this-total){ $page =$this-currentPage+1; return "lia href=".$this-path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" page=".$page." rel='next'span》/span/a/Li;} else { return ' Li class=' disabled ' span/span/Li;} } }我选择的方法是自定义新的方法生成超文本标记语言模板,模板中通过:{{$paginator-newrender()}}输出超文本标记语言

如果选择重构渲染()方法,只需要将上面的newrender()方法做一些小变动

public function render($ view=null,$ data=[]){ if($ this-hasPages()){ return sprint f(' ul class=' paging ' % s % s % s/ul ',$this-pre_page(),$this-pages_num(),$ this-next _ page());} }模板中通过:{{$paginator-render()}}输出超文本标记语言

最终效果如图:

注意:自定义HTML后,由于新的类继承了LengthAwarePaginator类,所以需要将手动分页方法第一步中新的LengthAwarePaginator更改为新的Newpage参数。

以上手动分页和自定义分页样式在Laravel5.5中的简单实现,就是边肖分享的全部内容。希望能给大家一个参考,支持我们。

版权声明:Laravel5.5手动分页和自定义分页样式的简单实现是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。