最近在項目中遇到了需要根據下拉框的條件篩選出符合條件的數據,然后進行列表顯示的問題。
在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解決了分頁的問題)。
苦思了幾天,終於將這個問題解決,不知道這是不是最好的解決辦法,若各位大神有更好地方法,煩請告知!感激不盡啊!
