Maison > cadre php > PensezPHP > Explication détaillée de la pagination ajax sans actualisation de certains contenus sous thinkphp

Explication détaillée de la pagination ajax sans actualisation de certains contenus sous thinkphp

藏色散人
Libérer: 2022-01-31 05:00:30
avant
2290 Les gens l'ont consulté

La colonne suivante du didacticiel thinkphp framework vous présentera la pagination ajax sans actualisation d'une partie du contenu de la page sous thinkphp. J'espère que cela sera utile aux amis dans le besoin !

La classe de pagination fournie avec le framework thinkphp nécessite que la page entière soit actualisée à chaque fois qu'elle est tournée. Ce type d'expérience utilisateur qui tourne une page est. évidemment pas idéal. , nous espérons qu'à chaque fois que nous tournons la page, nous actualisons uniquement les données dans la partie de l'ensemble de données que nous voulons. De cette façon, nous pouvons facilement penser à une communication asynchrone ajax, en utilisant ajax pour interagir de manière asynchrone avec le. base de données (j'utilise la base de données mysql pendant le processus de développement), et les données seront récupérées de la base de données. Les données interrogées sont renvoyées et les données d'origine sont remplacées par jquery, de sorte qu'une actualisation partielle puisse être effectuée sans actualiser la page, ainsi. obtenir l'effet désiré.
classe de pagination thinkphp ajax
Cette classe de pagination est une ressource trouvée en ligne. Vous pouvez créer une telle classe directement dans votre propre thinkphp. Mon nom de classe ici est AjaxPage.class.php. Si nécessaire, vous pouvez modifier l'espace de noms

<?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'=>'上一页','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 class=&#39;ajaxify&#39; id=&#39;big&#39; href=&#39;JavaScript:;&#39; onclick=&#39;".$this->ajax_func."(".$upRow.")'>".$this->config['prev']."</a>";
    }else{
        $upPage="";
    }

    if ($downRow <= $this->totalPages){
        $downPage="<a class=&#39;ajaxify&#39; id=&#39;big&#39; href=&#39;JavaScript:;&#39; onclick=&#39;".$this->ajax_func."(".$downRow.")'>".$this->config['next']."</a>";
    }else{
        $downPage="";
    }
    // << < > >>
    if($nowCoolPage == 1){
        $theFirst = "";
        $prePage = "";
    }else{
        $preRow =  $this->nowPage-$this->rollPage;
        $prePage = "<a class=&#39;ajaxify&#39; id=&#39;big&#39; href=&#39;JavaScript:;&#39; onclick=&#39;".$this->ajax_func."(".$preRow.")'>上".$this->rollPage."页</a>";
        $theFirst = "<a class=&#39;ajaxify&#39; id=&#39;big&#39; href=&#39;JavaScript:;&#39; onclick=&#39;".$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=&#39;ajaxify&#39; id=&#39;big&#39; href=&#39;JavaScript:;&#39; onclick=&#39;".$this->ajax_func."(".$nextRow.")' >下".$this->rollPage."页</a>";
        $theEnd = "<a class=&#39;ajaxify&#39; id=&#39;big&#39; href=&#39;JavaScript:;&#39; onclick=&#39;".$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=&#39;ajaxify&#39; id=&#39;big&#39; href=&#39;JavaScript:;&#39; onclick=&#39;".$this->ajax_func."(".$page.")'> ".$page." </a>";
            }else{
                break;
            }
        }else{
            if($this->totalPages != 1){
                $linkPage .= " <span class=&#39;current&#39;>".$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;
}

}
Copier après la connexion
.

Étapes spécifiques
1. Contrôleur
Affichez maintenant dans la méthode d'index, puis récupérez et ajaxReturn dans la méthode de page Notez ici que la récupération est la page de référence (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->show();
        //要查询的数据,limit表示每页查询的数量,这里为4条
        $data = $info->limit($p->firstRow.','.$p->listRows)->select();
        //assign方法往模板赋值
        $this->assign('list',$data);
        $this->assign('page',$page);
//        $res["content"] = $this->fetch('Index/index');
//        $this->ajaxReturn($res);
        $this->display();
    }
    public function page(){
        //实例化数据模型
        $info=M('info');
        //统计要查询数据的数量
        $count=$info->count();
        //实例化分页类,传入三个参数,分别是数据总数、每页显示的数据条数、要调用的jQuery ajax方法名
        $p=new \Think\AjaxPage($count,4,'server');
        //产生分页信息
        $page=$p->show();
        //要查询的数据,limit表示每页查询的数量,这里为4条
        $data = $info->limit($p->firstRow.','.$p->listRows)->select();
        //assign方法往模板赋值
        $this->assign('list',$data);
        $this->assign('page',$page);
        //ajax返回信息
        $res["content"] = $this->fetch('Index/article');
        $this->ajaxReturn($res);
    }
}
Copier après la connexion

2. html

Parmi eux, le modèle référencé est la partie du contenu qui doit être paginé

<!DOCTYPE html>
<html>
<head>
</head>
<p>
    hello world
</p>
<include file="Index/article" />
<script>
    function server(pid){  
        var pid = pid;
        $.get("{:U('Index/page')}", "p="+pid, function(data){  
             $("#server").replaceWith("<p  id=&#39;server&#39;>"
             +data.content+
             "</p>"); 
        });
    }
</script> 
<script src="__PUBLIC__/jq/jquery1.8.3.min.js"></script>
</html>
Copier après la connexion
Le modèle qui doit être paginé

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>
Copier après la connexion

Cela peut garantir que lorsque vous cliquez sur le numéro de page, le le contenu au-dessus du contenu paginé ne sera pas chargé à nouveau. Une fois de plus, la page Web sera gâchée

Partie 3.js

Cette étape est au centre de la réalisation de la pagination ajax sans actualisation. Elle utilise la communication ajax de jQuery via l'interaction ajax avec. la base de données, les données obtenues sont écrites dans le modèle et remplacent les précédentes. L'ensemble de données atteint l'objectif de pagination. server.js , peut être écrit en interne ou en externe, vous pouvez choisir librement

 <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>
Copier après la connexion

Ce serveur de noms de méthode est le troisième paramètre passé dans la classe de pagination instanciée dans le contrôleur. Il sera déclenché à chaque fois que vous cliquerez sur le modèle pour activer le. page. Ce serveur de méthode js (p) transmet le numéro de page de quelle page.

$p=new \Think\AjaxPage($count,4,&#39;server&#39;);
Copier après la connexion

Ce qui est utilisé ici est la forme .get de la méthode ajax dans jQuery pour communiquer entre ajax et l'arrière-plan. Pour obtenir les données renvoyées, utilisez la méthode replaceWith et utilisez

<div id=&#39;server&#39;>+数据</div>
Copier après la connexion

pour remplacer le p par l'identifiant de. serveur dans le modèle pour obtenir l'effet de pagination.

Apprentissage recommandé : "

tutoriel vidéo thinkphp"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal