ThinkPHP整合datatables实现服务端分页的示例代码


Posted in PHP onFebruary 10, 2018

最近做东西有一个需求,因为数据量很大,在这里我决定使用datatables的服务端分页,同时还需要传递查询条件到服务端。在网上搜索的大部分文章都感觉有些误差,于是自己封装了一下,主要配置/工具为:

服务端:php(使用thinkphp)

页面样式来自于H-ui框架(datatables版本为1.10.0)

主要修改(databases)配置项为:

1) bProcessing:true 使用ajax源

2) serverSide:true 使用服务端分页

3) createdRow:function(){} 回调函数,用于添加事件或类名

4) aoColumns 用于处理、显示数据,其中render属性用于自定义列

1.datatables 的js代码为:

$('.table-sort').dataTable({
 processing: true,
  serverSide: true,
  ajax: {
   "url":"{:U('Msg/index')}",
   "data":function(d){ //额外传递的参数
    d.mintime = $('#logmin').val();
    d.maxtime = $('#logmax').val();
   }
  },
  bStateSave: true,//状态保存
  aLengthMenu : [20, 30, 50, 100, 150],
  bProcessing : true,
  bAutoWidth: false,
  bFilter : true, //是否启动过滤、搜索功能
  bInfo : true, //是否显示页脚信息,DataTables插件左下角显示记录数 
  createdRow: function ( row, data, index ) {
   $(row).addClass('text-c');
   $('#count').html(data.recordsFiltered);
  },
  aoColumns: [
   {
    "sClass": "text-center",
    "data": "id",
    "render": function (data, type, full, meta) {
     return '<input type="checkbox" name="select" value="' + data + '" />';
    },
    "bSortable": false
   },
   { "mData": "id" },
   { "mData": "fromnickname"},
   { "mData": "content" },
   { "mData": "msgtype" },
   { "mData": "time"},
   {
    "sClass": "text-center",
    "data": "id",
    "render": function (data, type, full, meta) {
     html = '<a title="查看" href="javascript:;" rel="external nofollow" rel="external nofollow" onclick="show(`查看`,`__URL__/show/id/'+ data + '`,``,`610`)" class="ml-5" style="text-decoration:none"><i class="Hui-iconfont">查看</i></a>';
     html += '<a style="text-decoration:none" class="ml-5" onClick="signDel(this,'+ data +')" href="javascript:;" rel="external nofollow" rel="external nofollow" title="删除"><i class="Hui-iconfont"></i>删除</a>';
     return html;
    },
    "bSortable": false
   }
  ]
});

2.服务端方面:

控制器:
接收参数如下:
draw    前端传过来的值,原值返回,用于验证
mintime、maxtime 自定义参数(时间)
search.value  datatables搜索框参数,用于查询筛选
order.0.column  要排序的单元格(从0开始,字段需要自己设置)
order.0.dir   排序(升序、降序)
start    起始条数(第几条开始)
length    查询长度
返回的数据如下:
draw    返回前端传过来的值
recordsTotal  记录总条数
recordsFiltered  条件筛选后的记录总条数
data    服务端查询的数据
返回数据形式:json

3.服务端后端完整代码如下:

1)控制器代码:

public function index()
{
 if(IS_AJAX){
  $list = D('Msg')->getData(I('get.'));
  $this->ajaxReturn($list);
 }
 $this->display();
}

2) Model层代码:(*其中,dealTime方法主要用于处理时间段)

public function getData($data)
{
 //获取Datatables发送的参数 必要
 $draw = $data['draw']; //这个值直接返回给前台
 //获取时间区间
 $timeArr['mintime'] = $data['mintime'];
 $timeArr['maxtime'] = $data['maxtime'];
 $where = $this->dealTime($timeArr);
 //搜索框
 $search = trim($data['search']['value']); //获取前台传过来的过滤条件 
 if(strlen($search) > 0) {
  $where['id|fromnickname|content|msgtype'] = array('like','%'.$search.'%');
 }
 //定义查询数据总记录数sql
 $recordsTotal = $this->count();
 //定义过滤条件查询过滤后的记录数sql
 $recordsFiltered = $this->where($where)->count();
 //排序条件
 $orderArr = [1=>'id', 2=>'fromnickname', 3=>'content', 4=>'msgtype', 5=>'time'];
 //获取要排序的字段
 $orderField = (empty($orderArr[$data['order']['0']['column']])) ? 'id' : $orderArr[$data['order']['0']['column']];
 //需要空格,防止字符串连接在一块
 $order = $orderField.' '.$data['order']['0']['dir'];
 //按条件过滤找出记录
 $result = [];
 //备注:$data['start']起始条数 $data['length']查询长度
 $result = $this->field('id,fromnickname,content,msgtype,time')
     ->where($where)
     ->order($order)
     ->limit(intval($data['start']), intval($data['length']))
     ->select();
 //处理数据
 if(!empty($result)) {
  foreach ($result as $key => $value) {
   $result[$key]['time'] = date("Y-m-d H:i:s",$value['time']);
   $result[$key]['recordsFiltered'] = $recordsFiltered;
  }
 }
 //拼接要返回的数据
 $list = array(
  "draw" => intval($draw),
  "recordsTotal" => intval($recordsTotal),
  "recordsFiltered"=>intval($recordsFiltered),
  "data" => $result,
 );
 return $list;
}

3) 实现自定义ajax搜索

1. 在WdatePicker中添加onpicked回调函数
2. 执行table.fnFilter(),其中table为datatables对象

以WdatePicker插件为例(input框类似,绑定onchange事件即可):

<input type="text" onfocus="WdatePicker({maxDate:'#F{ $dp.$D(\'logmax\')||\'%y-%M-%d\'}', onpicked:function(){table.fnFilter();}})" name="mintime" id="logmin" class="input-text Wdate" style="width:120px;">

3. datatables中ajax属性中data属性定义额外要传递的参数

例子:

ajax: {
  "url":"{:U('Msg/index')}",
  "data":function(d){ //额外传递的参数
   d.mintime = $('#logmin').val();
   d.maxtime = $('#logmax').val();
  }

4) 代码截图:

a. html页面

ThinkPHP整合datatables实现服务端分页的示例代码 

b.js部分

ThinkPHP整合datatables实现服务端分页的示例代码 

以上这篇ThinkPHP整合datatables实现服务端分页的示例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
在IIS上安装PHP4.0正式版
Oct 09 PHP
PHP中include()与require()的区别说明
Mar 10 PHP
基于php验证码函数的使用示例
May 03 PHP
PHP判断远程图片是否存在的几种方法
May 04 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
php实现过滤UBB代码的类
Mar 12 PHP
php上传图片并压缩的实现方法
Dec 22 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
php抽象方法和普通方法的区别点总结
Oct 13 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
PHP实现APP微信支付的实例讲解
Feb 10 #PHP
PHP有序表查找之插值查找算法示例
Feb 10 #PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 #PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 #PHP
PHP基于redis计数器类定义与用法示例
Feb 08 #PHP
php处理抢购类功能的高并发请求
Feb 08 #PHP
php+redis实现商城秒杀功能
Nov 19 #PHP
You might like
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
PDO::query讲解
2019/01/29 PHP
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
python 正则式使用心得
2009/05/07 Python
使用Python的PEAK来适配协议的教程
2015/04/14 Python
python中随机函数random用法实例
2015/04/30 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
python Django的web开发实例(入门)
2019/07/31 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
js实现弹框效果
2021/03/24 Javascript
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android