ThinkPHP5.0(七)TP5框架下的分页功能,在一个页面操作进入后台后渲染回到操作的页面而非第一页 |
您所在的位置:网站首页 › 胶囊简笔画大全彩色 › ThinkPHP5.0(七)TP5框架下的分页功能,在一个页面操作进入后台后渲染回到操作的页面而非第一页 |
前言:
做WEB应用不可避免的要对查找到的数据进行分页的处理。 做分页的目的不是简单的为了界面的美观,也是为了防止一次查找到过多的数据占用服务器内存。分页其实就是限制查找的SQL语句一次只能查找到一页的数据量,然后以分页的形式展示出来。 所以简单总结下分页的好处: 用户体验加载时间和服务器负载提升浏览量和广告收入 TP5框架下的分页:官方文档中给到: ThinkPHP5.0 内置了分页实现,要给数据添加分页输出功能在 5.0 变得非常简单,可以直接在 Db 类 查询的时候调用 paginate 方法: // 查询状态为1的用户数据 并且每页显示10条数据 $list = Db::name('user')->where('status',1)->paginate(10); // 把分页数据赋值给模板变量 list $this->assign('list', $list); // 渲染模板输出 return $this->fetch()也可以改成模型的分页查询代码: // 查询状态为1的用户数据 并且每页显示10条数据 $list = User::where('status',1)->paginate(10); // 把分页数据赋值给模板变量 list $this->assign('list', $list); // 渲染模板输出 return $this->fetch()模板文件中分页输出代码如下: {volist name='list' id='user'} {$user.nickname} {/volist} {$list->render()} 主要参数: 参数描述list_rows每页数量page当前页path url路径query url额外参数fragment url锚点var_page分页变量type分页类名可以在调用分页方法的时候传入,例如: $list=Db::name('user')->where('status',1)->paginate(10,true,[ 'type'=>'bootstrap', 'var_page'=>'page', ]); 重点也是坑点:划重点了,专业采坑,造福后人。 为了考虑到用户体验:我们一定会考虑到在某个分页页面进行操作后再回到该页面!而不是方法默认的第一页面。 如图: 当时我想到的解决方法主要有三个: 方法1. 直接不进入后台采用Ajax的方法进行传参,然后局部刷新界面; 方法2.采用cookie或者session存储prevurl(执行跳转之前的路径),操作成功后跳转到pervurl; 方法3.采用paginate()方法的page参数。 方法1:方法一比较简单,我之前的博客也写到过Ajax实现二级联动只不过是后台操作变为报名操作,然后success后将界面通过jQuery的html()方法改变就行了。 方法二:方法二我是在一个TP3的项目中找到的,在TP5中有些方法已经被遗弃。 在控制器中的渲染界面的方法中: $p = I("get.page") ? I("get.page") : 1; cookie("prevUrl", "Admin/Order/order/page/" . $p);解释: 通过I方法看是否get得到page参数(TP5中为input()方法),如果get不到意味第一次进入分页界面,否则获取到当前分页,并且将$page以参数的形式拼好路由存入cookie。 在页面操作的后台的跳转事件中: $this->success("操作成功", cookie("prevUrl"));解释: 即为后退一步。 方法三:方法三为TP5框架自带的方法,提倡使用。主要是配置paginate()方法的page参数。这里的page参数的意义为渲染的时候从第几页开始读起。 主要问题是:你在分页页面的模板渲染函数中采用GET方法获取page参数,然后将参数以变量的方式传给page参数。 当然没这么简单!我们理一下思路,GET方法是通过url传参的, public/index/join_controller/jointeam.html?page=2 当我们点击第二分页的时候,url类似于这种形式,所以我们才能GET到, 当我们执行操作的的逻辑为: 第二分页的界面 -> 后台的报名操作 -> 模板渲染函数 -> 界面 所以在模板渲染函数中的GET方法是获取不到page的,因为它的上一步操作的url为报名操作,而不是page为2的界面。 所以:只有界面到模板渲染函数的才能GET到page,既点击这东西才行获取到。 解释: 当是界面到模板渲染函数的时候(既点击跳转分页的时候)我们将page存入cookie; 如果GET获取不到,即为后台的报名操作 -> 模板渲染函数 -> 界面(点了报名操作) 所以就将cookie中的值赋给page,得到当前页。 然后再配置paginate()方法的page参数: paginate(10, false,['page'=>$page]);代码总览: 这个是我直接从项目中复制的,不太完整,但分页处理已经都在里面了。 public function joinTeam() { if(isset($_GET['page'])){ $page = $_GET['page']; Cookie::set('pageTeam',$page,['prefix'=>'page_','expire'=>3600]); } elseif (Cookie::get('pageTeam','page_')!=null){ $page=Cookie::get('pageTeam','page_'); } else{ $page = 1; } $this->setingTimeInfo(); //获取到登陆用户的权限信息 $role=Session::get('ROLE','think'); if($role==TEACHER_RULE) {//如果是院系管理员权限,只能获取到本院的报名信息 $teamUnit = Unit::where('CATEGORY', CATEGORY::team)->paginate(5, false,['page'=>$page]); $deptId = Session::get('DEPTID', 'think');//获取登陆用户的院系信息 $teamUnit=$this->getJoinTeamState($teamUnit,$deptId);//为团队项目赋当前报名状态值 $this->assign('teamUnit',$teamUnit); return $this->fetch(); } 最后:1.如果考虑到cookie的浏览器适配的原因可以采用seesion; 2.最后记得将cookie或者session清理掉。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |