TP2.0或3.1 或者 3.2 下使用ajax+php做无刷新分页(转+自创)
1.前言
作为一名php程序员,我们开发网站主要就是为了客户从客户端进行体验,在这里,thinkphp框架自带的分页类是每次翻页都要刷新一下整个页面,这种翻页的用户体验显然是不太理想的,我们希望每次翻页只刷新我们想要的数据集部分的数据,这样可以给客户带来很好的体验效果。那么在TP下如何进行ajax无刷新分页呢?
1.1建立ajax分页
在TP框架的ThinkPHP\Library\Think文件夹下,有框架自己的page.class.php,我们新建一个Ajaxpage.class.php,下面这个类是我实际用到项目中的
当然,你也可以不在这里建立,在需要的控制器方法里面可以 require_once "require_once APP_ROOT_PATH.'Ajaxpage.class.php'; //php加载ajax分页类"
- <?php
- //【如果使用了TP3.2,请在这里加上namespace Think;】
- class Ajaxpage {
- // 分页栏每页显示的页数
- public $rollPage = 5;
- // 页数跳转时要带的参数
- public $parameter ;
- // 默认列表每页显示行数
- public $listRows = 20;
- // 起始行数
- public $firstRow ;
- // 分页总页面数
- protected $totalPages ;
- // 总行数
- protected $totalRows ;
- // 当前页数
- protected $nowPage ;
- // 分页的栏的总页数
- protected $coolPages ;
- // 分页显示定制
- protected $config = array('header'=>'条记录','prev'=>'上一页','next'=>'下一页','first'=>'第一页','last'=>'最后一页','theme'=>' %totalRow% %header% %nowPage%/%totalPage% 页 %upPage% %downPage% %first% %prePage% %linkPage% %nextPage% %end%');
- // 默认分页变量名
- protected $varPage;
- public function __construct($totalRows,$listRows='',$ajax_func,$parameter='') {
- $this->totalRows = $totalRows;
- $this->ajax_func = $ajax_func;
- $this->parameter = $parameter;
- $this->varPage = 'p' ;
- if(!empty($listRows)) {
- $this->listRows = intval($listRows);
- }
- $this->totalPages = ceil($this->totalRows/$this->listRows); //总页数
- $this->coolPages = ceil($this->totalPages/$this->rollPage);
- $this->nowPage = !empty($_GET[$this->varPage])?intval($_GET[$this->varPage]):1;
- if(!empty($this->totalPages) && $this->nowPage>$this->totalPages) {
- $this->nowPage = $this->totalPages;
- }
- $this->firstRow = $this->listRows*($this->nowPage-1);
- }
- public function nowpage($totalRows,$listRows='',$ajax_func,$parameter='') {
- $this->totalRows = $totalRows;
- $this->ajax_func = $ajax_func;
- $this->parameter = $parameter;
- $this->varPage = 'p' ;
- if(!empty($listRows)) {
- $this->listRows = intval($listRows);
- }
- $this->totalPages = ceil($this->totalRows/$this->listRows); //总页数
- $this->coolPages = ceil($this->totalPages/$this->rollPage);
- $this->nowPage = !empty($_GET[$this->varPage])?intval($_GET[$this->varPage]):1;
- if(!empty($this->totalPages) && $this->nowPage>$this->totalPages) {
- $this->nowPage = $this->totalPages;
- }
- $this->firstRow = $this->listRows*($this->nowPage-1);
- return $this->nowPage;
- }
- public function setConfig($name,$value) {
- if(isset($this->config[$name])) {
- $this->config[$name] = $value;
- }
- }
- public function show() {
- if(0 == $this->totalRows) return '';
- $p = $this->varPage;
- $nowCoolPage = ceil($this->nowPage/$this->rollPage);
- $url = $_SERVER['REQUEST_URI'].(strpos($_SERVER['REQUEST_URI'],'?')?'':"?").$this->parameter;
- $parse = parse_url($url);
- if(isset($parse['query'])) {
- parse_str($parse['query'],$params);
- unset($params[$p]);
- $url = $parse['path'].'?'.http_build_query($params);
- }
- //上下翻页字符串
- $upRow = $this->nowPage-1;
- $downRow = $this->nowPage+1;
- if ($upRow>0){
- $upPage="<a class='ajaxify' id='big' href='JavaScript:".$this->ajax_func."(".$upRow.")'>".$this->config['prev']."</a>";
- }else{
- $upPage="";
- }
- if ($downRow <= $this->totalPages){
- $downPage="<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$downRow.")'>".$this->config['next']."</a>";
- }else{
- $downPage="";
- }
- // << < > >>
- if($nowCoolPage == 1){
- $theFirst = "";
- $prePage = "";
- }else{
- $preRow = $this->nowPage-$this->rollPage;
- $prePage = "<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$preRow.")'>上".$this->rollPage."页</a>";
- $theFirst = "<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(1)' >".$this->config['first']."</a>";
- }
- if($nowCoolPage == $this->coolPages){
- $nextPage = "";
- $theEnd="";
- }else{
- $nextRow = $this->nowPage+$this->rollPage;
- $theEndRow = $this->totalPages;
- $nextPage = "<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$nextRow.")' >下".$this->rollPage."页</a>";
- $theEnd = "<a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$theEndRow.")' >".$this->config['last']."</a>";
- }
- // 1 2 3 4 5
- $linkPage = "";
- for($i=1;$i<=$this->rollPage;$i++){
- $page=($nowCoolPage-1)*$this->rollPage+$i;
- if($page!=$this->nowPage){
- if($page<=$this->totalPages){
- $linkPage .= " <a class='ajaxify' id='big' href='javascript:".$this->ajax_func."(".$page.")'> ".$page." </a>";
- }else{
- break;
- }
- }else{
- if($this->totalPages != 1){
- $linkPage .= " <span class='current'>".$page."</span>";
- }
- }
- }
- $pageStr = str_replace(
- array('%header%','%nowPage%','%totalRow%','%totalPage%','%upPage%','%downPage%','%first%','%prePage%','%linkPage%','%nextPage%','%end%'),
- array($this->config['header'],$this->nowPage,$this->totalRows,$this->totalPages,$upPage,$downPage,$theFirst,$prePage,$linkPage,$nextPage,$theEnd),$this->config['theme']);
- return $pageStr;
- }
- }
- ?>
2、ajax调用地址==》》 ajaxModule.class.php下的article_show_comment方法,返回结果:就是我们要替换的html数据和标签(注意:这里我写的是php的ajax方法,不是一个简单的method,通俗点就是jQuery的ajax里面的url)
- public function article_show_comment(){
- //统计要查询数据的数量
- $page_size = 5; //评论固定5条
- $page = intval($_REQUEST['p']);
- $id = intval($_REQUEST['id']);
- if(empty($page))$page = 1;
- $limit = (($page-1)*$page_size).",".$page_size ;
- $list = $GLOBALS['db']->getAll("select * from ".DB_PREFIX."article_comment where article_id = ".$id." and log_id = 0 and status=1 order by create_time desc limit ".$limit);
- $count = $GLOBALS['db']->getOne("select count(*) from ".DB_PREFIX."article_comment where article_id = ".$id." and log_id = 0 and status=1");
- //TP3.2使用下面
- //$where['status'] = array('gt',-1);
- //$_REQURST['cond'] && $where['cond'] = $_REQURST['cond']; //多条件查询判断
- // $list = M('Action')->where($where)->order('id desc')->limit($limit)->select();
- // $count[0]['count'] = M('Action')->where($where)->count("*");
- //end TP3.2
- //实例化分页类,传入三个参数,分别是总记录数、每页显示条数、要调用的jQuery ajax方法名
- require_once APP_ROOT_PATH.'app/Lib/Ajaxpage.class.php'; //php加载ajax分页类
- $p = new Ajaxpage($count[0]['count'],$page_size,'index'); //'index'是jQuery里面ajax方法名
- //产生分页信息
- $page=$p->show();
- //要查询的数据,limit表示每页查询的数量,这里为10条
- //$data = $info->where($where)->limit($p->firstRow.','.$p->listRows)->select();
- //assign方法往模板赋值
- $GLOBALS['tmpl']->assign('list',$list); //模板变量赋值
- $GLOBALS['tmpl']->assign('page',$page);
- //ajax返回信息,就是要替换的模板
- $res["content"] = $GLOBALS['tmpl']->fetch("article_show_comment.html"); //渲染模板,不输出但是接收模板内容(得到html块,用于替换主页面的分页div)
- echo json_encode($res);
- }
3、模板文件【deal_show.html】
直接在原模板文件</body>之前加上ajax方法,用来翻页作用,代码如下:
- <!-- ajax+php分页 -xzz5.11 -->
- <script type="text/javascript">
- $(function(){
- var init_id = 1;
- index(init_id); //初始化页面 init_id==1
- });
- function index(id){
- var id = id;
- var deal_id = {$deal_info.id};
- //把数据传递到要替换的控制器方法中,这里你还可以传入查询字段,比如phone,name等,后台通过【是否为空】来做过滤
- $.ajax({
- url:"/index.php?ctl=ajax&act=deal_show_comment",
- type:"GET",
- async:false,
- dataType:"JSON",
- data:{'p':id,'id':deal_id}, //把查询字段和值 通过这里传给后台ajax,实现多条件ajax查询分页
- success:function(data){
- //用get方法发送信息到ajax中的deal_show_comment方法
- $("#pagination").replaceWith(data.content); //html块替换html的div
- },
- error:function(data){
- console.log("4:ajax not run~");
- }
- });
- }
- </script>
4、注意啦,你应该还有一个页面【article_show_comment.html】,就是php进行 $this->assign("list",$list);
fetch()非常关键,获取的list和page数据渲染后的模板html文件,但是不输出,这里是关键点。====>>>>>>>>>>重中之重,fetch()的结果是:html块,用来替换deal_show.html的分页块
我们的目的:把独立的【rticle_show_comment.html】文件,去替换【deal_show.html】文件里面的<div>,看好哦,是【deal_show.html】展示分页数据list和分页$page的<div>。 明白了这个你就成功一半了。
使用TP的fetch()方法,在上面的ajaxModule.class.php的方法已经介绍了,在末尾部分,不懂自行查看TP手册fetch()
这里就给出替换内容的article_show_comment.html(ajax动态生成DOM,原来的关联js无效,所以再次引入即可)。
- <div id="pagination">
- <div class="blank0"></div>
- {foreach from=$list item=comment_item}
- {include file="inc/comment_item_nolog.html"} <!-- 这里的话,就是php另外引入的一个html文件,用来循环数据,在我的项目里他和下面的js有关联 -->
- {/foreach}
- <div class="blank0"></div>
- <div class="pages">{$page}</div>
- </div>
- <!-- 上面是动态生成的DOM,原html模板页面的关联js不生效,所以你没ajax调用一次,就需要引入一下js -->
- <script type="text/javascript" src="{$TMPL}/js/deal_comment.js"></script>
5、顺便提一下,ajaxModule.class.php和XXXXModule.class.php完全是不同的2个控制器(因为TP2.0版本控制器就是Module,你要是TP3.1以后的,可以看成是AjaxController.class.php 都可以的),一个用来返回ajax请求的结果,一个是普通的控制器。
6、在最后,顺道感谢 小king哥,ThankU!
TP2.0或3.1 或者 3.2 下使用ajax+php做无刷新分页(转+自创)的更多相关文章
- Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现
简单三步实现图片无刷新上传:注意是上传,至于上传时的验证,比如图片的尺寸,大小,格式判断.限制等,自行解决. 兼容性想还不错:FF,CH,IE,猎豹,都是可以实现的.如果看到回显.当然就是成功了. 经 ...
- 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项。
在用asp.net MVC3 的MusicStore时候 Edit某个数据项时提示下面的错误: 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectSt ...
- Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类
本文目录 1. 前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...
- docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」
很多人说docker改变了运维世界,这句话是从群体角度来说的,是统计学意义上的改变,像mysql,python这样被大规模使用的基础应用,docker化之后为整个群体所节省的时间是非常巨大的. 有人可 ...
- OLE DB访问接口“MICROSOFT.JET.OLEDB.4.0”配置为在单线程单位模式下运行,所以该访问接口无法用于分布式
OLE DB访问接口"MICROSOFT.JET.OLEDB.4.0"配置为在单线程单位模式下运行,所以该访问接口无法用于分布式 数据库操作excel时遇到的以上问题的解决方法 解 ...
- Mysql EF 触发器生成主键id 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 ;System.Data.Entity.Infrastructure.DbUpdateConcurrencyException
http://stackoverflow.com/questions/24725261/how-to-use-a-custom-identity-column-in-sql-with-entity-f ...
- vue2.0 不引用第三方包的情况下实现嵌套对象的拖拽排序功能
先上一张效果图,然后再上代码(由于只做效果,未做数据相关的处理:实际处理数据时不修改 dom 元素,只是利用 dom 元素传递数据,然后需改数据,靠数据驱动效果) <div :id=" ...
- SSH(Struts 2.3.31 + Spring 4.1.6 + Hibernate 5.0.12 + Ajax)框架整合实现简单的增删改查(包含分页,Ajax 无刷新验证该用户是否存在)
软件152 余建强 该文将以员工.部门两表带领大家进入SSH的整合教程: 源码下载:http://download.csdn.net/detail/qq_35318576/9877235 SSH 整合 ...
- thinkphp5.0调用ajax无刷新加载数据
控制器层那边就是调数据返回,这里不再赘述,视图层页面ajax部分写法如下 function shanchu(obj) { var code = $(obj).attr("code" ...
随机推荐
- git 查看commit提交的内容
在使用git的过程中,我们经常需要查看某次commit修改了哪些内容,与之相关的命令就是: git log git show 首先,需要通过git log打印所有commit hashID,之后的gi ...
- Android之ListView和GridVIew加载图片
清除缓存:ImageLoader 对象 . clearCache(); 使用: ImageLoader loader = new ImageLoader(ApplicationContext cont ...
- Json解析教程(四.FastJson 的使用)
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- uva 10618 Tango Tango Insurrection 解题报告
Tango Tango Insurrection Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebu ...
- OpenCV学习(18) 细化算法(6)
本章我们在学习一下基于索引表的细化算法. 假设要处理的图像为二值图,前景值为1,背景值为0. 索引表细化算法使用下面的8邻域表示法: 一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示 ...
- Informatica 常用组件Source Qualifier之八 会话前和会话后 SQL
可以在源限定符转换的"属性"选项卡中添加会话前和会话后 SQL 命令.您可能要使用会话前 SQL 以在会话开始时将时间标识行写入源表. PowerCenter 在读取源之前对源 ...
- Mac OS中Java Servlet与Http通信
Java中一个Servlet其实就是一个类,用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序.Servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器 ...
- 微软 WCF的几种寄宿方式,寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务
WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...
- 关于COM的Unicode string的精彩论述
I need to make a detour for a few moments, and discuss how to handle strings in COM code. If you are ...
- 避免闪烁的方法(OnEraseBkgnd)
在图形图象处理编程过程中,双缓冲是一种主要的技术.我们知道,假设窗口在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗口在重绘时因为过频的刷新而引起闪烁现象. 解决这一问题的有效方法就是双缓 ...