Laravel5.5 手动分页和自定义分页样式的简单实现
Laravel  /  管理员 发布于 7年前   160
基于Laravel5.5 在项目实施过程中,需要对从接口中获取的数据(或者通过搜索工具查询出来的数据)进行分页 一、创建手动分页 在laravel自带的分页中,一般是通过数据库查询访问paginate()方法来达到分页的效果 ,like this: class IndexControllerextends Controller 查看框架的分页源代码 #vender/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php 发现,分页用了 \Illuminate\Contracts\Pagination\LengthAwarePaginator 构造方法,查看这个构造方法 如果要实现手动分页,只需要使用这个构造方法,给定参数,就能达到分页的效果 贴代码: public function setPage2(Request $request,$data,$prepage,$total){ ($data 为需要进行分页的数据) 说明: 1、在考虑到代码的复用性,我将分页代码封装到app/Controllers/Controller.php中的一个方法里面,这样在其他控制器里只需要$this->setPage(Request $request,$data,$prepage,$total) 就能使用了,(前提:其他控制器继承了Controller.php) 2、分页的URL,因为我的项目的url一定会携带一个kw参数,所以我直接用str_replace替换"&page",如果是存在不携参分页的话,需要判断,到底是"?page"还是"&page"。(url的逻辑可以自己写) #分页 php 在模板中:{{$paginator->render()}}即能输出分页HTML,样式如下: 二、自定义分页样式 在实际开发中,不希望用户在浏览时直接浏览最后几页,只想用户从前往后依次的浏览,如百度搜索分页,这时候,就想修改分页的样式,经过一个下午的奋战,贴出解决过程 在上一环节中,手动创建了分页,了解HTML的模板生成是render()方法, #\Illuminate\Contracts\Pagination\LengthAwarePaginator 经过思考,我们不去改laravel框架的源代码,可以通过重构render方法或者重新定义一个生成HTML模板的方法来实现自定义HTML模板 因为我们只需要自定义HTML模板,所以,可以创建一个文件,继承\Illuminate\Contracts\Pagination\LengthAwarePaginator 类 看代码: 我选择的方法是自定义新的方法生成HTML模板,模板中通过:{{$paginator->newrender()}}输出HTML 如果选择重构render()方法,只需要将上面的newrender()方法做一些小变动 模板中通过:{{$paginator->render()}}输出HTML 最终效果如图: 注意:自定义HTML后因为新建了一个类继承了LengthAwarePaginator类,需要将第一步手动分页的方法中new LengthAwarePaginator 修改为 new Newpage 参数不变。 以上这篇Laravel5.5 手动分页和自定义分页样式的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。{ publicfunctionindex() { $person = DB::table('person')->paginate(15); return view('index.pagTest',['person'=> $person]); }}
/** * Paginate the given query. * * @param int $perPage * @param array $columns * @param string $pageName * @param int|null $page * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator * * @throws \InvalidArgumentException */ public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) { $page = $page ?: Paginator::resolveCurrentPage($pageName); $perPage = $perPage ?: $this->model->getPerPage(); $results = ($total = $this->toBase()->getCountForPagination()) ? $this->forPage($page, $perPage)->get($columns) : $this->model->newCollection(); return $this->paginator($results, $total, $perPage, $page, [ 'path' => Paginator::resolveCurrentPath(), 'pageName' => $pageName, ]); }
$value) { $this->{$key} = $value; } $this->total = $total; $this->perPage = $perPage; $this->lastPage = max((int) ceil($total / $perPage), 1); $this->path = $this->path !== '/' ? rtrim($this->path, '/') : $this->path; $this->currentPage = $this->setCurrentPage($currentPage, $this->pageName); $this->items = $items instanceof Collection ? $items : Collection::make($items); }
#每页显示记录 $prePage = $prepage; //$total =count($data); $allitem = $prepage *100; $total > $allitem ? $total = $allitem : $total; if(isset($request->page)){ $current_page =intval($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); # $data must be array $item =array_slice($data,($current_page-1)*$prePage,$prePage); $paginator = new LengthAwarePaginator($item,$total,$prePage,$current_page,[ 'path'=>$url, 'pageName'=>'page' ]); return $paginator; }
$paginator = $this->setPage2($request,$data,25,$sum); $data =$paginator->toArray()['data'];
/** * Render the paginator using the given view. * * @param string|null $view * @param array $data * @return \Illuminate\Support\HtmlString */ public function render($view = null, $data = []) { return new HtmlString(static::viewFactory()->make($view ?: static::$defaultView, array_merge($data, [ 'paginator' => $this, 'elements' => $this->elements(), ]))->render()); }
hasPages()) { return sprintf("
%s %s %s
", $this->pre_page(), $this->pages_num(), $this->next_page() ); } } #上一页 public function pre_page(){ if($this->currentPage == 1){ //dd($this->currentPage); return "public function render($view=null,$data=[]){ if($this->hasPages()) { return sprintf("
%s %s %s
", $this->pre_page(), $this->pages_num(), $this->next_page() ); } }您可能感兴趣的文章:
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号