Foreword
The paging class that comes with the thinkphp framework is to turn pages every time The entire page has to be refreshed. This kind of page-turning user experience is obviously not ideal. We hope that each time we turn the page, we only refresh the data in the part of the data set we want. In this way, we can easily think of ajax asynchronous communication, using ajax Asynchronously interact with the database (I use mysql database during the development process), return the data queried from the database, replace the original data with jquery, and perform partial refresh without refreshing the page, thus achieving our expectations Effect.
thinkphp ajax paging class
This paging class is a resource found on the Internet. You can create such a class directly in your own thinkphp. My class name here is AjaxPage.class.php
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2009 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- // $Id: Page.class.php 2712 2012-02-06 10:12:49Z liu21st $ namespace Common\Common; 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 = C('VAR_PAGE') ? C('VAR_PAGE') : '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 = C('VAR_PAGE') ? C('VAR_PAGE') : '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>ajax_func."(".$upRow.")'>".$this->config['prev']."</a>"; }else{ $upPage=""; } if ($downRow totalPages){ $downPage="<a>ajax_func."(".$downRow.")'>".$this->config['next']."</a>"; }else{ $downPage=""; } // >> if($nowCoolPage == 1){ $theFirst = ""; $prePage = ""; }else{ $preRow = $this->nowPage-$this->rollPage; $prePage = "<a>ajax_func."(".$preRow.")'>上".$this->rollPage."页</a>"; $theFirst = "<a>ajax_func."(1)' >".$this->config['first']."</a>"; } if($nowCoolPage == $this->coolPages){ $nextPage = ""; $theEnd=""; }else{ $nextRow = $this->nowPage+$this->rollPage; $theEndRow = $this->totalPages; $nextPage = "<a>ajax_func."(".$nextRow.")' >下".$this->rollPage."页</a>"; $theEnd = "<a>ajax_func."(".$theEndRow.")' >".$this->config['last']."</a>"; } // 1 2 3 4 5 $linkPage = ""; for($i=1;$irollPage;$i++){ $page=($nowCoolPage-1)*$this->rollPage+$i; if($page!=$this->nowPage){ if($pagetotalPages){ $linkPage .= " <a>ajax_func."(".$page.")'> ".$page." </a>"; }else{ break; } }else{ if($this->totalPages != 1){ $linkPage .= " <span>".$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; } } ?>
Specific steps
Next, we will implement the thinkphp non-refresh paging effect step by step starting from the controller.
1. Controller part
This is just the core code of a part of the controller.
//实例化数据模型 $info=M('info'); //统计要查询数据的数量 $count=$info->where("ID='$id'")->count(); //实例化分页类,传入三个参数,分别是数据总数、每页显示的数据条数、要调用的jQuery ajax方法名 $p=new \Host\Common\AjaxPage($count,10,'server'); //产生分页信息 $page=$p->show(); //要查询的数据,limit表示每页查询的数量,这里为10条 $data = $server_info->where("ID='$id'")->limit($p->firstRow.','.$p->listRows)->select(); //assign方法往模板赋值 $this->assign('list',$data); $this->assign('page',$page); //ajax返回信息 $res["content"] = $this->fetch('Index/myinfolist') $this->ajaxReturn($res);
2. Template part
The template name: myinfolist.html is consistent with the template rendered in the controller above.
$res["content"] = $this->fetch('Index/myinfolist')
Because the front-end uses the bootstrap framework, many classes in this template are from bootstrap. You don’t need to worry too much about this. Just look at the key points of the whole process.
nbsp;html> <p> </p><p> </p><p> </p><p> </p><p> </p><p><i></i>信息列表</p> <p> </p>
a | b | c | d |
---|---|---|---|
{$info.a} | {$info.b} | {$info.c} | {$info.d} |
{$page}
<script></script>