web应用中经常要根据用户提交的查询条件进行过滤,再以列表方式显示在浏览器上.如果这种查询是多种条件的组合,并要进行分页显示,则如何在分页导航中保持查询条件,是必须解决的问题.
在Thinkphp中, 已有分页类"ORG.Util.Page",并且可以用$page->parameter保存查询参数, 但可能是受示例程序的影响,很多tper纠结于$page->parameter不能保存一些复杂条件,并自行开发出一些很复杂的程序解决这个问题. 其实只要用好$page->parameter,只需几行代码就能解决.
先考察一下用户提交查询条件的过程: 一般情况下,会给用户提供一个form,让用户设定各种查询过滤条件,然后用户提交这个form,提交可以是传统的POST,也可以是Ajax,这个无所谓. 服务器收到用户提交的查询请求后, 先得到$_POST数据,再由此转换成查询语句中的$map,然后通过模型的where($map)语句获取符合条件的记录总数及当前分页记录集合,返回给客户端显示. $_POST数据是简洁明晰的,而$map则跟数据库的表/字段相关,有时很复杂,比如含有二维数组.
由上面分析可知, 只要在$page->parameter保存$_POST过来的数据,就完全保存了用户设定的查询条件. 因为$_POST是一个关联数组, 我把它转换成json字符串,就可以传递给$page->parameter了, 因此有了下面代码:

  1. import("ORG.Util.Page");
  2.  
  3. if (!empty($_GET['filter'])) {
  4. //如果有GET进来的filter数据,就说明是后台在分页时候保存有用户查询条件
  5. $filter = json_decode($_GET['filter'],true);
  6. }else if (!empty($_POST)) {
  7. //如果没有GET的filter数据,但有POST数据,说明是用户直接提交了查询条件
  8. $filter = $_POST;
  9. } else {
  10. $filter = null;
  11. }
  12. $map = $this->getFilterMap($filter); //这个是把原始的$_POST数据转换成查询语句中的$map条件
  13.  
  14. $count = $model->where($map)->count();
  15. $page = new Page($count,C('PAGESIZE'));
  16. $page->parameter ='filter='. urlencode(json_encode($filter)); // 把查询条件转成json格式
  17. $show = $page->show();
  18. $this->assign('page',$show);

只增加了6行代码,就完全实现预期功能. 而且前端不用做任何改变

Thinkphp分页时查询条件保存方法的更多相关文章

  1. 使用AspNetPager进行分页,查询条件丢失问题

    在Asp.Net中使用AspNetPager进行分页时,发现一个问题: 当通过查询条件进行查询后,对查询结果进行翻页操作时,查询条件会丢失. 当修改UrlPaging属性后(设置UrlPaging=“ ...

  2. thinkphp分页时修改last显示标题

    需要修改Page.class.php里lastSuffix为false,这样才能修改last显示标题. 然后就可以设置了 或者直接在方法中声明: $p->lastSuffix = false; ...

  3. jqgrid postData setGridParam 调用多次时查询条件累加的问题--详情页查询导致的无法在新的页面中查询

    $("#btn_search").click(function () { url = "/AMEvents/GetGridJson?evtype=1"; var ...

  4. jqgrid postData setGridParam 调用多次时查询条件累加的问题

    var postData = $(gridId).jqGrid("getGridParam", "postData"); $.each(paras, funct ...

  5. ThinkPHP多表查询之join方法

    现在的目的是要把article_category中的name字段导入到article中去 表yz_article如下 表yz_article_category如下

  6. LINQ to SQL 运行时动态构建查询条件

    在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...

  7. ThinkPHP分页使用例子(二十一)

    原文:ThinkPHP分页使用例子(二十一) ThinkPHP分页使用 PHP代码: public function fenye(){ $User = M('Leyangjun'); // 实例化Us ...

  8. Servlet 分页保存查询条件

    第一种情况:一个页面走一个JSP页面和Servlet 解决办法: /** 把用户这一次选择的所有条件保存Map集合中,再把 map存到Session会话中,点击分页时进入将Servlet中再将Sess ...

  9. HBase多条件及分页查询的一些方法

    HBase是Apache Hadoop生态系统中的重要一员,它的海量数据存储能力,超高的数据读写性能,以及优秀的可扩展性使之成为最受欢迎的NoSQL数据库之一.它超强的插入和读取性能与它的数据组织方式 ...

随机推荐

  1. Android学习笔记(广播机制)

    1.Android的广播机制介绍 收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同.接受广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理.好比我们收听交 ...

  2. 通过移位与或非运算获取整形最大值,最小值,以及获取输入的int类型整数的二进制表示

    以上是最终效果 实现类: package com.corejava.chap02; public class IntBin { private int value; public IntBin(int ...

  3. hdoj 1892(二维树状数组)

    Problem H Time Limit : 5000/3000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub ...

  4. 一种实现C++反射功能的想法(三)

    如何实现类型名跟类型的对应, 我们很容易想到map, 没错, 就是使用map实现的. std::map<std::string, .....>, 等下, 第二部分该填什么类型, 一个函数指 ...

  5. javascript为目标标签添加class样式

    利用jQuery $("#目标id").addClass("加的class名字");

  6. 我和CPP的第二次约会

    1.变量之间的运算形式依赖于变量的数据类型,如i = i + j;当 i 和 j 是整型或者浮点型,则代表两个数的相加,如果是第一章所说的Sales_item类型,那么就是这两个变量的成分相加(如果书 ...

  7. 安装search everything中文语言包

    Everything 作为很多人的必备工具,特写这篇文章,一方面让想使用国外优秀软件的英语小白有一段过渡期,另一方面也为自己整理下资料.当然,这个可不是不学好英语的正当理由. 步骤: 1. 下载好se ...

  8. 删除svn文件

    删除svn文件 sudo find . -name ".DS_Store" -exec rm -r {} \; sudo find . -name ".git" ...

  9. 一篇旧文章,结合汇编探索this指针

    //VC6.0下成功编译 #include <iostream.h> class X{ public: void foo(int b,int c){ this->a=b*c; cou ...

  10. matplotlib.pyplot 绘图详解 matplotlib 安装

    apt-get install python-matplotlib 转载自: http://www.cnblogs.com/qianlifeng/archive/2012/02/13/2350086. ...