ThinkPHP中 按條件查詢后列表顯示


最近在項目中遇到了需要根據下拉框的條件篩選出符合條件的數據,然后進行列表顯示的問題。

在ThinkPHP中進行列表顯示的傳統過程:通過在后台控制器中查詢出數據,然后通過$this->assign()來實現控制器數據向頁面的傳遞,在頁面中通過<foreach>或<volist>標簽來進行數據的解析,(注:在通過標簽進行數據的解析時需要以“$”符號的形式)。

在進行條件查詢時,需要通過jquery中ajax的方式將條件GET到后台控制器,后台控制器中接收數據,然后根據條件進行查詢,將查詢結果返回。

在項目實際操作時遇到了這樣的兩個問題,(1)當在將數據傳遞到后台控制器,后台控制器通過查詢條件獲取查詢結果后,只能通過$this->ajaxReturn(查詢結果)的方式將數據返回到前台頁面的回調函數(在網上看到一個大神說還有一個display的方法顯示,一直苦尋未果,若有大神知道,一定記得給說一聲,感激不盡!)。而在前台進行解析時是以json的數據格式進行解析,所以無法通過ThinkPHP的模板解析獲得數據進行顯示(即無法通過"$"符號的方式進行解析顯示,"$"符號是javascript中的關鍵字)。(2)在開始時分頁是使用的ThinkPHP中已經封裝的分頁方法,其在進行分頁時是實例化的一個分頁對象,然后將分頁對象中的分頁列表傳遞到頁面進行解析,從而實現頁面數據分頁。但是在通過ajax請求獲取的數據只能返回到回調函數,也無法通過ThinkPHP的解析獲取分頁列表,從來導致分頁無法使用。所以,總的來說,無法通過ThinkPHP解析json數據進行顯示。

在網上苦苦尋覓,沒有找到什么好辦法,所以只好自己硬着頭皮寫了。因為ThinkPHP無法解析,所以只好通過javascript的方式,將數據解析顯示。

 1 for(var i=0;i<ss.length;i++)
 2                     {
 3                         var infoList=$("<div id='divUserTable' class='divMenuItemTableClass'>"+"<input type='hidden' name='hiddenInfoId' class='hiddenClass' id='hiddenInfoId_"+i+"'"+"value="+"'"+ss[i]["userid"]+"'"+"/>"
 4                                 +"<div id='divUserTableSelect' class='fontNoneWeight'><input type='checkbox' class='inputCheckbox' id='checkboxUserSelect_"+i+"'"+"/></div>"
 5                                 +"<div id='divUserTableTitle' class='fontNoneWeight'>"+ss[i]["user_name"]+"</div>"
 6                                 +"<div id='divUserTableNum' class='fontNoneWeight'>"+ss[i]["studentorteacherid"]+"</div>"
 7                                 +"<div id='divUserTablePwd' class='fontNoneWeight'>"+ss[i]["password"]+"</div>"
 8                                 +"<div id='divUserTableWorkShop' class='fontNoneWeight'>"+ss[i]["workshop_name"]+"</div>"
 9                                 +"<div id='divUserTableOpreation'><div id='divUserTableOpreationUpdate'><a id='aWorkShopTableOperationUpdate' target='right' href='__APP__/Admin/WorkShop/ShowUpdateWorkShopUser/user_id/"+ss[i]["userid"]+"'"+">修改</a></div></div>"
10                                 +"</div>");                        
11                         $("#divUserInfoList").append(infoList);
12                     }   

通過將獲取的數據進行解析,然后進行字符串的拼接,最后將拼接的字符串顯示到列表中,從而實現以無刷新的方式進行按條件查詢后顯示到頁面,至此終於將第一個問題解決了!(說句實話,字符串拼接真的很惡心人!眾位仁兄,若有好方法,請務必告知!)。

唉,由於分頁無法解析,內心苦苦掙扎,經過激烈的思想斗爭,終於狠下心來重新寫一個分頁吧。所以學習了一下EasyUI的pagination分頁,確實功能強大,非常實用。

先插入一點題外話,說一下EasyUI的pagination分頁的使用。在使用pagination分頁時首先需要引入EasyUI的文件包,引入后需在頁面引入jquery.easyui.min.js、themes/default/easyui.css、themes/icon.css這三個文件。這樣頁面才可以使用分頁。分頁的使用有兩種加載方式,(1)class加載方式(2)js加載方式

class加載:

<div id="box" class="easyui-pagination"
data-options="total:2000,pageSize:10"
style="background:#efefef;border:1px solid #ccc;">
</div>

通過在div中添加class="easyui-pagination"就可以將分頁加載進來,data-options="total:2000,pageSize:10,"是對分頁列表中數據或操作的設置。

js加載:

$(function () {

    $('#box').pagination({
        total : 5,
        pageSize : 1,
        pageNumber : 1,
        pageList : [1,2],
        //loading : true,
        buttons : [{
            iconCls : 'icon-add',
        },'-',{
            iconCls : 'icon-edit',
        }],
        //layout : ['first','prev','links','next','last'],
        //showPageList : false,
        //showRefresh : false,
        //beforePageText : '弟弟',
        //afterPageText : '有{pages}個',
        displayMsg : '從{from}到{to},有{total}人',
        onSelectPage : function (pageNumber, pageSize) {
            $('#box').pagination('loading');
            $('#content').panel('refresh', 'user.php?page='+pageNumber+'&pagesize='+pageSize);
            setTimeout(function () {
                $('#box').pagination('loaded');
            }, 1000);
            
            
        },
        onBeforeRefresh : function (pageNumber, pageSize) {
            alert('刷新之前');
        },
        onRefresh : function (pageNumber, pageSize) {
            alert('刷新之后');
        },
        onChangePageSize : function (pageSize) {
            alert('每頁顯示的條數被改變!');
        } 
    });
    
    $(document).click(function () {
        /*
        $('#box').pagination('refresh', {
            pageSize : 2,
            pageNumber : 2,
        });
        */
        $('#box').pagination('select', 2);
    });

});

通過在js文件中$("#id").pagination({});的方式將對應id的div設置成分頁列表。說到這里,就無可避免的需要說一下pagination的屬性列表:

其中,主要用的有total:數據的總條數,pageNumber:當前顯示的頁碼數,pageSize:每頁顯示的數量,pageList:可讓用戶自己手動改變的每頁顯示的數量。有了這些足以做數據的分頁了。

回歸正題:現在需要將所需條件進行提交,然后獲取數據,同時進行分頁。話不多說,上代碼。

 1 $.ajax({
 2                     type:"GET",
 3                     url:"__URL__/GetCountByClassify",
 4                     data:{con:condition},
 5                     dataType:"json",
 6                     success:function(ss){   
 7                         var sum=ss[0]["count(*)"];
 8                         $("#divUserListPaging").pagination({
 9                             total:sum,
10                             pageSize:10,
11                             showPageList:false,
12                             beforePageText:"第",
13                             afterPageText:"共{pages}頁",
14                             pageNumber:pageNum,
15                             onSelectPage: function ( pageNumber, pageSize) {
16                                 $(this).pagination('loading');
17                                 newData(pageNumber,pageSize);
18                                 $(this).pagination('loaded'); 
19                                 makePage(pageNumber);
20                             }
21                         });                                               
22                     }
23                 });

根據路徑將條件傳遞到控制器的方法中,通過條件查詢獲取查詢結果,然后獲取查詢結果的總數量,回調分頁函數,根據當前的顯示頁碼和顯示數量,進行數據分頁。(解決第二個問題,用EasyUI解決了分頁的問題)。

苦思了幾天,終於將這個問題解決,不知道這是不是最好的解決辦法,若各位大神有更好地方法,煩請告知!感激不盡啊!

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM