jqGrid表格应用——读取与查询数据

jerry PHP 2015年08月20日 收藏

jqGrid可以动态读取和加载外部数据,本文将结合PHP和Mysql给大家讲解如何使用jqGrid读取数据并显示,以及可以通过输入关键字查询数据的ajax交互过程。

查看演示

jqGrid本身带有search和edit表格模块,但是这些模块会使得整个插件体积显得有点庞大,而且笔者认为jqGrid的搜索查询和编辑/添加功能不好用,所以笔者放弃jqGrid自有的search和edit表格模块,借助jquery利器来完成相关功能,符合项目的实际应用。

XHTML

  1. <div id="opt">
  2. <div id="query">
  3. <label>编号:</label><input type="text" class="input" id="sn" />
  4. <label>名称:</label><input type="text" class="input" id="title" />
  5. <input type="submit" class="btn" id="find_btn" value="查 询" />
  6. </div>
  7. <input type="button" class="btn" id="add_btn" value="新 增" />
  8. <input type="button" class="btn" id="del_btn" value="删 除" />
  9. </div>
  10. <table id="list"></table>
  11. <div id="pager"></div>

我们在建立一个可供查询编号和名称的两个输入框,以及“新增”和“删除”按钮,新增和删除功能在接下来的文章中会专门讲解。此外xhtml中还有一个放置表格的#list(jqGrid生成表格)以及分页条#pager。

Javascript

首先调用jqGrid,我们以本站jqGrid:强大的表格插件的应用一文中的数据为例,调用jqGrid,生成表格,请看代码和注释。

  1. $("#list").jqGrid({
  2. url:'do.php?action=list', //请求数据的url地址
  3. datatype: "json", //请求的数据类型
  4. colNames:['编号','名称','主屏尺寸','操作系统','电池容量', '价格(¥)','操作'], //数据列名称(数组)
  5. colModel:[ //数据列各参数信息设置
  6. {name:'sn',index:'sn', editable:true, width:80,align:'center', title:false},
  7. {name:'title',index:'title', width:180, title:false},
  8. {name:'size',index:'size', width:120},
  9. {name:'os',index:'os', width:120},
  10. {name:'charge',index:'charge', width:100,align:'center'},
  11. {name:'price',index:'price', width:80,align:'center'},
  12. {name:'opt',index:'opt', width:80, sortable:false, align:'center'}
  13. ],
  14. rowNum:10, //每页显示记录数
  15. rowList:[10,20,30], //分页选项,可以下拉选择每页显示记录数
  16. pager: '#pager', //表格数据关联的分页条,html元素
  17. autowidth: true, //自动匹配宽度
  18. height:275, //设置高度
  19. gridview:true, //加速显示
  20. viewrecords: true, //显示总记录数
  21. multiselect: true, //可多选,出现多选框
  22. multiselectWidth: 25, //设置多选列宽度
  23. sortable:true, //可以排序
  24. sortname: 'id', //排序字段名
  25. sortorder: "desc", //排序方式:倒序,本例中设置默认按id倒序排序
  26. loadComplete:function(data){ //完成服务器请求后,回调函数
  27. if(data.records==0){ //如果没有记录返回,追加提示信息,删除按钮不可用
  28. $("p").appendTo($("#list")).addClass("nodata").html('找不到相关数据!');
  29. $("#del_btn").attr("disabled",true);
  30. }else{ //否则,删除提示,删除按钮可用
  31. $("p.nodata").remove();
  32. $("#del_btn").removeAttr("disabled");
  33. }
  34. }
  35. });

关于jqGrid相关选项设置请参照:jqGrid中文说明文档——选项设置。

此外,当我们点击“查询”按钮的时候,向后台php程序发送查询关键字请求,jqGrid根据服务端返回的结果进行响应,请看代码。

  1. $(function(){
  2. $("#find_btn").click(function(){
  3. var title = escape($("#title").val());
  4. var sn = escape($("#sn").val());
  5. $("#list").jqGrid('setGridParam',{
  6. url:"do.php?action=list",
  7. postData:{'title':title,'sn':sn}, //发送数据
  8. page:1
  9. }).trigger("reloadGrid"); //重新载入
  10. });
  11. });

PHP

在上两段JS代码代码中,可以看到读取列表和查询业务请求的后台url地址都是do.php?action=list,后台php代码负责根据条件查询mysql数据表中的数据,并将数据以JSON格式返回给前端jqGrid,请看php代码:

  1. include_once ("connect.php");
  2. $action = $_GET['action'];
  3. switch ($action) {
  4. case 'list' : //列表
  5. $page = $_GET['page']; //获取请求的页数
  6. $limit = $_GET['rows']; //获取每页显示记录数
  7. $sidx = $_GET['sidx']; //获取默认排序字段
  8. $sord = $_GET['sord']; //获取排序方式
  9. if (!$sidx)
  10. $sidx = 1;
  11. $where = '';
  12. $title = uniDecode($_GET['title'],'utf-8'); //获取查询关键字:名称
  13. if(!empty($title))
  14. $where .= " and title like '%".$title."%'";
  15. $sn = uniDecode($_GET['sn'],'utf-8'); //获取查询关键字:编号
  16. if(!empty($sn))
  17. $where .= " and sn='$sn'";
  18. //执行SQL
  19. $result = mysql_query("SELECT COUNT(*) AS count FROM products where deleted=0".$where);
  20. $row = mysql_fetch_array($result, MYSQL_ASSOC);
  21. $count = $row['count']; //获取总记录数
  22. //根据记录数分页
  23. if ($count > 0) {
  24. $total_pages = ceil($count / $limit);
  25. } else {
  26. $total_pages = 0;
  27. }
  28. if ($page > $total_pages)
  29. $page = $total_pages;
  30. $start = $limit * $page - $limit;
  31. if ($start < 0 ) $start = 0;
  32. //执行分页SQL
  33. $SQL = "SELECT * FROM products WHERE deleted=0".$where." ORDER BY $sidx $sord
  34. LIMIT $start , $limit";
  35. $result = mysql_query($SQL) or die("Couldn t execute query." . mysql_error());
  36. $responce->page = $page; //当前页
  37. $responce->total = $total_pages; //总页数
  38. $responce->records = $count; //总记录数
  39. $i = 0;
  40. //循环读取数据
  41. while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  42. $responce->rows[$i]['id'] = $row[id];
  43. $opt = "<a href='edit.php'>修改</a>";
  44. $responce->rows[$i]['cell'] = array (
  45. $row['sn'],
  46. $row['title'],
  47. $row['size'],
  48. $row['os'],
  49. $row['charge'],
  50. $row['price'],
  51. $opt
  52. );
  53. $i++;
  54. }
  55. echo json_encode($responce); //输出JSON数据
  56. break;
  57. case '' :
  58. echo 'Bad request.';
  59. break;
  60. }

值得一提的是,我们在进行中文查询时,即输入中文关键字进行查询时,需要用js进行escape编码,然后php接收中文关键字时相应的进行解码,否则会出现无法识别中文字符串的现象,本例中采用uniDecode函数进行解码,代码一并奉上:

  1. /处理接收jqGrid提交查询的中文字符串
  2. function uniDecode($str, $charcode) {
  3. $text = preg_replace_callback("/%u[0-9A-Za-z]{4}/", toUtf8, $str);
  4. return mb_convert_encoding($text, $charcode, 'utf-8');
  5. }
  6. function toUtf8($ar) {
  7. foreach ($ar as $val) {
  8. $val = intval(substr($val, 2), 16);
  9. if ($val < 0x7F) { // 0000-007F
  10. $c .= chr($val);
  11. }
  12. elseif ($val < 0x800) { // 0080-0800
  13. $c .= chr(0xC0 | ($val / 64));
  14. $c .= chr(0x80 | ($val % 64));
  15. } else { // 0800-FFFF
  16. $c .= chr(0xE0 | (($val / 64) / 64));
  17. $c .= chr(0x80 | (($val / 64) % 64));
  18. $c .= chr(0x80 | ($val % 64));
  19. }
  20. }
  21. return $c;
  22. }

最后,感谢您对helloweba的关注,我们将在后面的文章继续讲解jqGrid的增删改等应用,敬请期待。