2010-12-20 117 views
4

我希望有人可以幫助我。我一直在用這個瘋狂地發瘋。DataTables服務器端單獨列過濾

我有一種情況,我加載的DataTables網格(真棒片!),一切都很好。然後我去搜索,並遇到問題。網格中填充的數據來自兩個不同的數據庫表(這很好),但是當有人執行搜索時,我無法知道去哪裏獲取數據。我需要知道搜索關於什麼標準(即標題或聯繫人)。我知道當通過默認搜索框從服務器調用搜索時,有什麼變量像「sSearch_0」這些變量都未被設置,這些變量是如何設置的?

以下是表中的初始化代碼:

oTable = $('#example').dataTable({ 
"bJQueryUI": true, 
"bFilter": true, 
"sPaginationType": "full_numbers", 
"bPaginate " : true, 
"bServerSide" : true, 
"sAjaxSource" : "php/tabledata.php", 
"aoColumnDefs": [ 
    { "bSortable": false, "aTargets": [ 0,6,8 ] }, 
{ "sClass": "tdCenter", "aTargets": [ 0,1,2,3,4,5,6,7,8 ] } 
    ], 
"fnServerData": function (sSource, aoData, fnCallback) { 
aoData.push({ "name": "userid", "value": userid }); 
$.getJSON(sSource, aoData, function (json) { 
fnCallback(json) 
}); 
}   

});

我已經調查選項將數據添加到「fnServerData」和實際使用,對於第一次初始化服務器調用,但我不知道該如何使用,對於後續服務器調用。我試圖使用「fnFilter」,但我沒有看到執行服務器調用更多的數據。在這一點上,除了默認搜索框外,我沒有看到任何其他方式執行服務器調用,並且我知道某種方式可以知道搜索的是哪一列。

有人可以幫助我,並指出我在正確的方向嗎?

+0

首先,請允許我歡迎你的StackOverflow!其次,我會告訴你一篇關於'[如何提出完美問題](http://tinyurl.com/so-hints/)'的文章',最後,我會問你是否可以發佈你正在使用的jQuery和數據庫調用(無論是外部php腳本還是jQuery本身)。希望我們能夠幫助您... =) – 2010-12-20 18:16:20

+0

您是使用「全部搜索」功能還是單列搜索?對於全部搜索,您將不得不編寫代碼來在兩個不同的表中搜索每一列。如果是列搜索,則可以匹配列索引中的sSearch_x(通常爲x列索引)。 – DarrellNorton 2010-12-20 18:40:33

+0

我使用的是「全部搜索」功能。我不知道如何設置單列搜索,我很想得到這個工作。你如何設定? – ackerchez 2010-12-20 18:47:28

回答

2

如果您從DataTables插件的服務器獲取數據,則必須將bServerSide設置爲true,將sAjaxSource設置爲適當的URL,並且如果需要執行任何回調,則理想地配置fnServerData。

如果使用服務器端處理,則需要在服務器上處理所有排序,篩選和分頁。如果您正確配置DataTable,那麼只要有分頁,過濾或排序事件,就會從服務器請求數據。

DataTables server-side API documentation

PHP example of server-side processing

+0

這應該被標記爲答案^ – Marc 2013-10-04 09:53:00

1

對於所有誰也參照這一問題的好處,這裏是我已經實現。

客戶端(JavaScript)

,按Enter鍵執行fnFilter。

$(tableId + " thead input").keypress(function() { 
    if (event.which == 13) { 
    event.preventDefault(); 
    oTable.fnFilter(this.value, $("thead input").index(this)); 
    } 
}); 

服務器端(紅寶石)

找到sSearch_(INT)參數哈希,和檢索鍵的列索引。 從數組中獲取列名並構建搜索字符串。

def column_search 
    search_string = [] 
    params.keys.map {|x| x if params[x].present? and x.include? "sSearch_"}.compact.each do |search| 
    index = search.split("_").last.to_i 
    search_string << "#{columns[index]} ilike '%#{params[search]}%'" 
    end 
    search_string.join(' and ') 
end