CodeIgniter提供了很多內建的元件庫可以用,Pagination就是其中一個,雖然展現的方式我們未必滿意,但是畢竟是內建的東西,當然要研究一下了。

$config['base_url'] = '/vender/gridview/';
$config['total_rows'] = $this->mdl_vend->get_listcount($searchterm);
$config['per_page'] = $pagerows; 
$this->pagination->initialize($config); 

$data['pagination'] = $this->pagination->create_links();

按照官方文件上大概是這樣設定,不過它還需要告訴pagination頁碼是在第幾個網址上,還有官網上所寫的PageNo實際上應該是RowNo才對。另外官網上是直接用count查詢結果的方式知道資料筆數,不過我喜歡用MySQL的LIMIT特性,理論查到的資料筆數應該就只有一頁,所以另外加了一個專門算筆數的函式,這樣應該可以減輕一點伺服器的負擔。

不過這都不是重點,重點是當你需要查詢的時候,這下網址就有得搞了。當查詢沒有內容時網址會變怎樣?有中文時又會變怎樣?搜尋條件太多造成網址過長怎麼辦?怎麼撤銷查詢?這都是問題。我還是喜歡用比較快速的解決方式,既然有查詢必然有個<form></form>(條件少當然可以不用form,不過我喜歡用通則來解問題,這樣即使換人接手也不會太痛苦),那就在這裡動手腳了,先做個隱藏欄位放recno,然後想辦法把換頁的鏈接偷過來,再submit它。

<form id='search' class='search' method='post'>
    <input type='hidden' id='recno' name='recno' />
    <label for='searchterm'>查找</label>
    <input id='searchterm' name='searchterm' />
    <button type='submit'> 搜尋 </button>
</form>

搜尋這一塊大概像上面這樣,頁碼區加上個<div id='pagination'></div>然後再加上一段javascript來偷。

$(document).ready( function() {
    $('.pagination a').bind('click', function() {
        var url = $(this).attr('href')
        pageno = ((matchs = url.match(/(\d+)$/))!= undefined) ? matchs[0] : 0;
        $('#recno').attr('value', pageno);
        $('#search').submit();    
        return false;
    });
});

由於我們前面的設定,網址會像/vender/gridview/10這樣,用jQuery的語法將換頁的所有鏈接全部綁定click事件,我們要取的是最後面的數字,因此使用match的方式將這個數字取出來,然後放進那個隱藏欄位,接著幫它submit一下,最後的return false是要讓原本的鏈接不會有動作。接著要告訴它換到哪一頁,加上下面的程式碼。

$config['cur_page'] = $recno;

看吧,它的變數名稱是cur_page,我傳給他的是recno,反正這樣就完成了。這樣的好處是,你的頁面只要管post過來的東西,有條件就搜尋,沒有就不用下條件,而且很容易把原本的搜尋條件再送回搜尋欄位裏面,或者加一個清除條件的按鈕也是不錯的設計。

缺點是使用者按刷新頁面的時候會出來一個重新送資料的警告,不過如果你的程式寫得容易操作,使用者按刷新頁面的機會也不高。若是給企業用戶的話,請他們按搜尋鈕就好了。

CodeIgniter的線上文件雖然都寫得很清楚,但是也有些東西是沒有寫出來的,比如說參數設定就有些省略了,最簡單就是直接打開system的原始檔來看看,還可以精進自己的程式功力呢。

創作者介紹

人生四十宅開始 二號宅

漠哥 發表在 痞客邦 PIXNET 留言(0) 人氣()