1. 程式人生 > >poscms基於list標簽實現的查詢分頁功能

poscms基於list標簽實現的查詢分頁功能

span utf 我們 cms rtti png bsp 控制 start

poscms系統本身有一個在查詢頁(search頁面)實現的查詢分頁功能,基於系統封裝的php函數dr_search_url()

但是今天的需求除了導航欄、列表頁、詳情頁都實現查詢功能外,關鍵是有兩個不同的模塊,模塊不同,如果用

系統的search的話,那就得弄兩個search頁面出來,其實搜索結果頁面完全就是照搬列表頁,所以,我為什麽不

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

技術分享圖片

1.篩選條件的獲取以及查詢頁的路徑拼接

<div class="paixu">
    <span>排序方式:</span>
    <a class
="xuanxiang active" href="javascript:search(‘starttime‘);">裝載日期</a>
    <a class="xuanxiang" href="javascript:search(‘cyl‘);">承運量從高到低</a>
    <a class="xuanxiang" href="javascript:search(‘cyl_desc‘);">承運量從低到高</a>
    <a class="xuanxiang" href="javascript:search(‘you‘);"
>有效天數</a> </div> <script type="text/javascript" charset="utf-8"> function search(order){ var rtype = $(".rtype").val(); var cylf = $(".cylf").val()?$(".cylf").val():0; var cylt = $(".cylt").val()?$(".cylt").val():9999999999; var from = $(".from
").val()?$(".from").val():""; var to = $(".to").val()?$(".to").val():""; var title = $(".title").val()?$(".title").val():""; var starttimef = $("#txtBeginDate").val()?parseInt(new Date($("#txtBeginDate").val()).getTime())/1000:0; var starttimet = $("#txtEndDate").val()?parseInt(new Date($("#txtEndDate").val()).getTime())/1000:9999999999; window.location.href = "/index.php?s=goodsplate&c=category&id=2"+"&rtype="+rtype+"&cylf="+cylf+
                  "&cylt="+cylt+"&from="+from+"&to="+to+"&title="+title+"&starttimef="+
                  starttimef+"&starttimet="+starttimet+"&order="+order; }; </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=2
&rtype=%E5%86%85%E6%B2%B3&cylf=2&cylt=9999999999&from=&to=&title=
&starttimef=1535328000&starttimet=1535673600&order=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
rtype=$rtype LIKE_title=%$title% LIKE_from=%$from% LIKE_to=%$to%
BW_cyl=$cylf,$cylt BW_starttime=$starttimef,$starttimet
order=$order
catid=2 pagesize=12 page=1} ...... {/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`.`from` LIKE "%%" AND
`imt_1_goodsplate`.`to` LIKE "%%" AND
`imt_1_goodsplate`.`cyl` BETWEEN 2 AND 9999999999 AND
`imt_1_goodsplate`.`starttime` BETWEEN 1535328000 AND 1535673600 AND
`imt_1_goodsplate`.`catid` = 2 AND
`imt_1_goodsplate`.`status` = 9
ORDER BY `imt_1_goodsplate`.`cyl` DESC
LIMIT 0,12

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頁面,所有的一切只需要在這個頁面就可以完成!!!驚喜不驚喜?刺激不刺激?

好了,繼續下一篇,來談談針對前端小姐姐拋出的問題,我是怎麽解決的。

poscms基於list標簽實現的查詢分頁功能