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 相关文章推荐
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
php array_map array_multisort 高效处理多维数组排序
Jun 11 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
php 搜索框提示(自动完成)实例代码
Feb 05 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
php5.3 注意事项说明
Jul 01 PHP
php画图实例
Nov 05 PHP
8个PHP程序员常用的功能汇总
Dec 18 PHP
php析构函数的简单使用说明
Aug 24 PHP
php mysql 封装类实例代码
Sep 18 PHP
PHP内置加密函数详解
Nov 20 PHP
PHP sdk文档处理常用代码示例解析
Dec 09 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
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
Python如何实现线程间通信
2020/07/30 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
美国名牌太阳镜折扣网站:Eyedictive
2017/05/15 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
劳资员岗位职责
2013/11/11 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
毕业自我鉴定书
2014/03/24 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
2015年技术员工作总结
2015/04/10 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
python munch库的使用解析
2021/05/25 Python
nginx中proxy_pass各种用法详解
2021/11/07 Servers
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
正则表达式基础与常用验证表达式
2022/06/16 Javascript