插件窝 干货文章 详解thinkphp下部分内容的ajax无刷新分页

详解thinkphp下部分内容的ajax无刷新分页

amp gt lt class 272    来源:    2024-10-27

下面thinkphp/" target="_blank">thinkphp框架教程栏目将给大家介绍thinkphp下页面内部分内容的ajax无刷新分页,希望对需要的朋友有所帮助!

thinkphp框架自带的分页类是每次翻页都要刷新一下整个页面,这种翻页的用户体验显然是不太理想的,我们希望每次翻页只刷新我们想要的数据集部分的数据,这样我们很容易想到ajax异步通信,用ajax与数据库(本人在开发过程中使用的是mysql数据库)异步交互,将从数据库查询的数据返回,用jquery替换原有的数据,从而在不刷新这个页面的情况下进行局部刷新,从而达到我们预期的效果。
thinkphp ajax 分页类
这个分页类是网上找到的资源,大家可以直接在自己的thinkphp里创建这么一个类,我这里类名是 AjaxPage.class.php,如有需要,可修改命名空间

<?php 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(&#39;header&#39;=>'条记录','prev'=&gt;'上一页','next'=&gt;'下一页','first'=&gt;'第一页','last'=&gt;'最后一页','theme'=&gt;' %totalRow% %header% %nowPage%/%totalPage% 页 %upPage% %downPage% %first%  %prePage%  %linkPage%  %nextPage% %end%');
// 默认分页变量名
protected $varPage;


public function __construct($totalRows,$listRows='',$ajax_func,$parameter='') {
    $this-&gt;totalRows = $totalRows;
    $this-&gt;ajax_func = $ajax_func;
    $this-&gt;parameter = $parameter;
    $this-&gt;varPage = C('VAR_PAGE') ? C('VAR_PAGE') : 'p' ;
    if(!empty($listRows)) {
        $this-&gt;listRows = intval($listRows);
    }
    $this-&gt;totalPages = ceil($this-&gt;totalRows/$this-&gt;listRows);     //总页数
    $this-&gt;coolPages  = ceil($this-&gt;totalPages/$this-&gt;rollPage);
    $this-&gt;nowPage  = !empty($_GET[$this-&gt;varPage])?intval($_GET[$this-&gt;varPage]):1;
    if(!empty($this-&gt;totalPages) &amp;&amp; $this-&gt;nowPage&gt;$this-&gt;totalPages) {
        $this-&gt;nowPage = $this-&gt;totalPages;
    }
    $this-&gt;firstRow = $this-&gt;listRows*($this-&gt;nowPage-1);
}

 public function nowpage($totalRows,$listRows='',$ajax_func,$parameter='') {
    $this-&gt;totalRows = $totalRows;
    $this-&gt;ajax_func = $ajax_func;
    $this-&gt;parameter = $parameter;
    $this-&gt;varPage = C('VAR_PAGE') ? C('VAR_PAGE') : 'p' ;
    if(!empty($listRows)) {
        $this-&gt;listRows = intval($listRows);
    }
    $this-&gt;totalPages = ceil($this-&gt;totalRows/$this-&gt;listRows);     //总页数
    $this-&gt;coolPages  = ceil($this-&gt;totalPages/$this-&gt;rollPage);
    $this-&gt;nowPage  = !empty($_GET[$this-&gt;varPage])?intval($_GET[$this-&gt;varPage]):1;
    if(!empty($this-&gt;totalPages) &amp;&amp; $this-&gt;nowPage&gt;$this-&gt;totalPages) {
        $this-&gt;nowPage = $this-&gt;totalPages;
    }
    $this-&gt;firstRow = $this-&gt;listRows*($this-&gt;nowPage-1);

    return $this-&gt;nowPage;
}

public function setConfig($name,$value) {
    if(isset($this-&gt;config[$name])) {
        $this-&gt;config[$name]    =   $value;
    }
}

public function show() {
    if(0 == $this-&gt;totalRows) return '';
    $p = $this-&gt;varPage;
    $nowCoolPage      = ceil($this-&gt;nowPage/$this-&gt;rollPage);
    $url  =  $_SERVER['REQUEST_URI'].(strpos($_SERVER['REQUEST_URI'],'?')?'':"?").$this-&gt;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-&gt;nowPage-1;
    $downRow = $this-&gt;nowPage+1;
    if ($upRow&gt;0){
        $upPage="<a>ajax_func."(".$upRow.")'&gt;".$this-&gt;config['prev']."</a>";
    }else{
        $upPage="";
    }

    if ($downRow totalPages){
        $downPage="<a>ajax_func."(".$downRow.")'&gt;".$this-&gt;config['next']."</a>";
    }else{
        $downPage="";
    }
    //  &gt;&gt;
    if($nowCoolPage == 1){
        $theFirst = "";
        $prePage = "";
    }else{
        $preRow =  $this-&gt;nowPage-$this-&gt;rollPage;
        $prePage = "<a>ajax_func."(".$preRow.")'&gt;上".$this-&gt;rollPage."页</a>";
        $theFirst = "<a>ajax_func."(1)' &gt;".$this-&gt;config['first']."</a>";
    }
    if($nowCoolPage == $this-&gt;coolPages){
        $nextPage = "";
        $theEnd="";
    }else{
        $nextRow = $this-&gt;nowPage+$this-&gt;rollPage;
        $theEndRow = $this-&gt;totalPages;
        $nextPage = "<a>ajax_func."(".$nextRow.")' &gt;下".$this-&gt;rollPage."页</a>";
        $theEnd = "<a>ajax_func."(".$theEndRow.")' &gt;".$this-&gt;config['last']."</a>";
    }
    // 1 2 3 4 5
    $linkPage = "";
    for($i=1;$irollPage;$i++){
        $page=($nowCoolPage-1)*$this-&gt;rollPage+$i;
        if($page!=$this-&gt;nowPage){
            if($pagetotalPages){
               $linkPage .= " <a>ajax_func."(".$page.")'&gt; ".$page." </a>";
            }else{
                break;
            }
        }else{
            if($this-&gt;totalPages != 1){
                $linkPage .= " <span>".$page."</span>";
            }
        }
    }
    $pageStr  =  str_replace(
        array('%header%','%nowPage%','%totalRow%','%totalPage%','%upPage%','%downPage%','%first%','%prePage%','%linkPage%','%nextPage%','%end%'),
        array($this-&gt;config['header'],$this-&gt;nowPage,$this-&gt;totalRows,$this-&gt;totalPages,$upPage,$downPage,$theFirst,$prePage,$linkPage,$nextPage,$theEnd),$this-&gt;config['theme']);
    return $pageStr;
}

}

具体步骤
1.控制器
现在index方法里display,再在page方法里fetch,ajaxReturn,这里要注意fetch的是引用页(article)

<?php namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function index(){
        $info=M(&#39;info&#39;);
        //统计要查询数据的数量
        $count=$info->count();
        //实例化分页类,传入三个参数,分别是数据总数、每页显示的数据条数、要调用的jQuery ajax方法名
        $p=new \Think\AjaxPage($count,4,'server');
        //产生分页信息
        $page=$p-&gt;show();
        //要查询的数据,limit表示每页查询的数量,这里为4条
        $data = $info-&gt;limit($p-&gt;firstRow.','.$p-&gt;listRows)-&gt;select();
        //assign方法往模板赋值
        $this-&gt;assign('list',$data);
        $this-&gt;assign('page',$page);
//        $res["content"] = $this-&gt;fetch('Index/index');
//        $this-&gt;ajaxReturn($res);
        $this-&gt;display();
    }
    public function page(){
        //实例化数据模型
        $info=M('info');
        //统计要查询数据的数量
        $count=$info-&gt;count();
        //实例化分页类,传入三个参数,分别是数据总数、每页显示的数据条数、要调用的jQuery ajax方法名
        $p=new \Think\AjaxPage($count,4,'server');
        //产生分页信息
        $page=$p-&gt;show();
        //要查询的数据,limit表示每页查询的数量,这里为4条
        $data = $info-&gt;limit($p-&gt;firstRow.','.$p-&gt;listRows)-&gt;select();
        //assign方法往模板赋值
        $this-&gt;assign('list',$data);
        $this-&gt;assign('page',$page);
        //ajax返回信息
        $res["content"] = $this-&gt;fetch('Index/article');
        $this-&gt;ajaxReturn($res);
    }
}

2.模板
柱模板 index.html

其中,引用的模板为需要分页的这部分内容

立即学习“PHP免费学习笔记(深入)”;

nbsp;html&gt;



<p>
    hello world
</p>
<include></include><script>
    function server(pid){  
        var pid = pid;
        $.get("{:U(&#39;Index/page&#39;)}", "p="+pid, function(data){  
             $("#server").replaceWith("<p  id=&#39;server&#39;>"
             +data.content+
             ""); 
        });
    }
</script> 
<script></script>

需要分页的模板

article.html

   <div id="server">
        <div class="row-fluid"  >
            <div class="span12">
                <div class="portlet box green">
                    <div class="portlet-title">
                        <div class="caption"><i class="icon-globe"></i>信息列表</div>
                    </div>

                    <div class="portlet-body" >
                
                        <table class="table table-striped table-bordered table-hover table-full-width" id="sample_1">

                            <thead>

                                <tr>
                                    <th class="hidden-480">a</th>
                                    <th class="hidden-480">b</th>
                                    <th class="hidden-480">c</th>
                                    <th class="hidden-480">d</th>
                                </tr>

                            </thead>

                            <tbody>
                                    //循环赋值
                                    <foreach name=&#39;list&#39; item=&#39;info&#39;>
                                        <tr>
                                            <td>{$info.a}</td>
                                            <td>{$info.b}</td>     
                                            <td>{$info.c}</td>
                                            <td>{$info.d}</td>
                                         
                                        </tr>
                                    </foreach>
                                
                            </tbody>
                            
                        </table>
                        //分页信息
                        <div class="row-fluid"> {$page} </div>
                        
                    </div>
                </div>    
            </div>        
        </div>
</div>

这样就可以保证,点击页码的时候,不会导致分页内容上边的内容会再次加载一遍,造成网页乱

3.js部分
这一步是实现ajax无刷新分页的重点,用到了jQuery的ajax通信,通过与数据库的ajax交互,将获取到的数据写到模板中,替换掉之前的数据集,达到分页的目的。server.js ,可写在内部也可写在外部,自由选择

 <script>
    function server(pid){  
        var pid = pid;
        $.get("{:U(&#39;Index/page&#39;)}", "p="+pid, function(data){  
             $("#server").replaceWith("<p  id=&#39;server&#39;>"
             +data.content+
             "</p>"); 
        });
    }
</script>

这个方法名 server 就是控制器中实例化分页类中传的第三个参数,每次在模板上点击翻页,都会触发这个js方法server(p),里面传递的是第几页的页码。

$p=new \Think\AjaxPage($count,4,&#39;server&#39;);

这里用到的是jQuery里ajax方法的.get形式进行ajax与后台通信,拿到返回的数据用replaceWith方法,用

<div id=&#39;server&#39;>+数据</div>

替换模板中id为server的p,实现分页效果。

推荐学习:《thinkphp视频教程》