联系官方销售客服

1835022288

028-61286886

POSCMS分享经验 版主:论坛审计组
poscms基于list标签实现的查询分页功能(转载)pos
类型:POSCMS 更新时间:2019-10-18 09:39:57 php

poscms基于list标签实现的查询分页功能(转载)

poscms系统本身有一个在查询页(search页面)实现的查询分页功能,基于系统封装的php函数dr_search_url()

但是今天的需求除了导航栏、列表页、详情页都实现查询功能外,关键是有两个不同的模块,模块不同,如果用

系统的search的话,那就得弄两个search页面出来,其实搜索结果页面完全就是照搬列表页,所以,我为什么不

直接用列表页作为模板呢,不去走系统的search控制器。下面上列表页:

1.筛选条件的获取以及查询页的路径拼接

复制代码

<div =>
    <span>排序方式:</span>
    <a = href=>装载日期</a>
    <a = href=>承运量从高到低</a>
    <a = href=>承运量从低到高</a>
    <a = href=>有效天数</a>
</div>
<script type= charset=> rtype = $( cylf = $().val()?$().val(): cylt = $().val()?$().val():  = $().val()?$().val(): to = $().val()?$().val(): title = $().val()?$().val(): starttimef = $().val()?parseInt( Date($().val()).getTime())/: starttimet = $().val()?parseInt( Date($().val()).getTime())/:= ++rtype++cylf+
+cylt++++to++title++
                  starttimef++starttimet++</script>

复制代码

页面是前端小姐姐写的,日历点击之后,获取的值为字符串 2018-08-27 的形式,我得要把它转成 int 型的时间戳

才能用于后面的查询比较;

看到那些三元表达式后面flase赋值为0或者9999999999么,这是根据该字段在数据库中的实际值范围而取的,数据

库中时间戳为10位数,所以我这里设置了一个不选定时间上限时的查询条件值(9999999999);

另外,当前列表页路由是  /index.php?s=goodsplate&c=category&id=2 ,所以可以看出js将查询条件直接提交到当前

页面;

当点击不同排序条件时,将执行对应的函数,此时将排序条件通过函参的方式拼接到路径中;

2.php脚本获取地址栏查询条件参数

点击查询条件之后,将跳转到拼有查询条件的路由(不难看出还是这个列表页),接下来通过php脚本获取地址栏参数

先来看路径(出货港、卸货港、货品名称没有填):

/index.php?s=goodsplate&c=category&id=&=%E5%%%E6%B2%B3&=&=&=&=&=
&=&=&=cyl_desc

所以,你可以很直观地看到一些筛选条件(分类-内盒、承运量范围-2~9999999999、装载日期范围-1535328000~

15356736000、排序方式-承运量降序)

复制代码

<?php
    $data = $_GET;
    $rtype = $data['rtype']?$data['rtype']:null;
    $cylf = $data['cylf']?$data['cylf']:0;
    $cylt = $data['cylt']?$data['cylt']:9999999999;
    $from = $data['from']?$data['from']:null;
    $to = $data['to']?$data['to']:null;
    $title = $data['title']?$data['title']:null;
    $starttimef = $data['starttimef']?$data['starttimef']:0;
    $starttimet = $data['starttimet']?$data['starttimet']:9999999999;
    $order = $data['order']?$data['order']:null;?>

复制代码

注:poscms的list标签查询的时候,对于查询条件值为null的会过滤掉,也就是不会写到sql里去。

3.list标签查询

在上面的脚本后面,就需要根据拿到的条件来写list标签的语法了:

复制代码

{list action=module module=goodsplate
 


 catid= pagesize= page=/list}

复制代码

中间加粗的字体就是查询的主要条件,用到了模糊查询(LIKE_)、范围查询(BW_)和排序(order)

这样就根据条件实现了list标签的了查询,顺便来看一下生成的sql:

复制代码

SELECT * FROM `imt_1_goodsplate` WHERE
 `imt_1_goodsplate`.`rtype` =  AND
 `imt_1_goodsplate`.`title` LIKE  AND
 `imt_1_goodsplate`.`` LIKE  AND
 `imt_1_goodsplate`.`to` LIKE  AND
 `imt_1_goodsplate`.`cyl` BETWEEN  AND  AND
 `imt_1_goodsplate`.`starttime` BETWEEN  AND  AND
 `imt_1_goodsplate`.`catid` =  AND
 `imt_1_goodsplate`.`status` =  
ORDER BY `imt_1_goodsplate`.`cyl` DESC 
LIMIT ,

复制代码

4.分页功能

其实分页功能的实现依据是一个page值,通过在路径中添加page=number,来实现后端LIMIT参数的改变

注意:poscms有个很坑爹的地方就是这个limit,我们一般要实现从第10项开始,往后查5项,都会这么写:

limit(10,5),但是poscms却是这么写的:$this->db->limit(5,10),这个源程序的开发者怕是故意和大家作对

吧。

之前查询结果很多的话,就得分页了,那1、2、3页的路径怎么获取呢,首先我封装了一个一行的php函数

方便页面里面调用:

function dr_cururl(){    return $_SERVER['REQUEST_URI'];
}

这个方法返回地址栏的全部地址(其实这块有个小bug,但是不影响使用,就是当页面处于第二页的时候,

地址栏会有查询条件参数+&page=2,此时第三页的地址应该是通过dr_cururl()函数获取的地址截去page参数

加上page=3,不截去的话就变成了条件参数+&page=2&page=3,这也是我刚刚想到的,明天去完善一下这个

函数)

在这里我用了一个同事以前提供的判断上一页下一页page值的脚本,之前的脚本a标签的地址是写死的,我后期

通过上面的函数完善了一下,这里贴上代码:

复制代码

 {if empty($get.page)}
 {php $page=1;}
 {else}
 {php $page=$get.page;}
 {/if} <!--上一页-->
 {if $page > 1} 
 {php $pra = $page-1;}
 {else}
 {php $pra=1;}
 {/if} <!--下一页-->
 <!--$nums为最大页码-->
 {if $page==$nums}
 {php $next = $nums;}
 {else}
 {php $next = $page+1;}
 {/if}
 {if $nums==1}     <div class="inner" style="text-align:center;margin-top:20px;">
         <a>共{$nums}页</a>
     </div>
 {else}     <div class="inner" style="text-align:center;margin-top:20px;">
         <a>共{$nums}页</a>
         <a href="{dr_cururl()}&page=1">首页</a>
         <a href="{dr_cururl()}&page={$pra}">上一页</a>
         <a href="{dr_cururl()}&page={$next}">下一页</a>
         <a href="{dr_cururl()}&page={$nums}">尾页</a>
     </div>
 {/if}

复制代码

注意:$nums是poscms系统开启分页(list标签中有page=1时开启分页)后返回的最大页数

 

 

至此,就完成了在列表页实现的查询、分页功能,注意,除了dr_cururl()这个函数是写在公共函数库文件里面,

其他所有上面列出的代码都是写在列表页的,所有的东西都是写在这个页面(list页面)的,不需要去动系统的

控制器,不需要去建search页面,所有的一切只需要在这个页面就可以完成!