2015-09-07 232 views
3

我有一個SQL表,其中36000個條目要顯示在Datatables列表中。 分頁效果很好,因爲我開發這樣的:jQuery Datatables:使用Ajax分頁搜索和過濾

var table = $('.datatable').DataTable({ 
    pageLength : 20, 
    lengthChange : false, 
    processing : true, 
    serverSide : true, 
    ajax : { 
     url :"ajax.php", 
     type: "post", 
    } 
}); 

在我的文件ajax.php,我只是附和我的臺詞(JSON編碼),根據頁碼設置的限制。

問題是本機過濾和搜索不再有效。 當我想過濾一列時,「處理」圖層出現,然後消失,但我的數據仍然是相同的。 當我想通過表進行研究時,沒有任何反應。

所以,這裏是我的問題:

  1. 我怎樣才能恢復搜索和過濾?
  2. 如何過濾和搜索所有行(不僅僅是顯示的行)?用Ajax,是的,但在JQuery中如何?

感謝的提前

編輯: 感謝對阿卜杜勒·拉赫曼·賽義德,我設法做搜索的一部分。 這裏是我做了什麼:

var table = $('.datatable').DataTable({ 
    pageLength : 20, 
    lengthChange : false, 
    processing : true, 
    serverSide : true, 
    ajax : { 
     data : function(d) { 
      d.searching = get_search($('.datatable')); 
     }, 
     url :"ajax.php", 
     type: "post", 
    }, 
    searching : false, 
}); 

$('.datatable thead th').each(function() { 
    var title = $(this).data('name'); 
    $('.datatable').find('tfoot tr').append('<td><input type="text" name="'+title+'"/></td>'); 
}); 

table.columns().every(function() { 
    var that = this; 
    $('input', this.footer()).on('keyup', function(e) { 
     that.search(this.value).draw(); 
    } 
}); 

function get_search(datatable) { 
    var result = []; 
    datatable.find('tfoot').find('input').each(function() { 
     result.push([$(this).attr('name'), $(this).val()]); 
    }); 
    return result; 
} 

用於過濾,我開發一個醜陋的代碼:

$('.datatable').find('th').click(function() { 
    var item = $(this); 
    removeClasses($('.datatable'), item.index()); 
    if(item.hasClass('sorting_asc')) { 
     item.removeClass('selected_asc').addClass('selected_desc'); 
    } else { 
     item.removeClass('selected_desc').addClass('selected_asc'); 
    } 
}); 

function get_sorting(datatable) { 
    var result = false; 
    datatable.find('th').each(function() { 
     var item = $(this); 
     var name = item.data('name'); 
     if(item.hasClass('selected_asc')) { 
      result = name+' ASC'; 
     } else if(item.hasClass('selected_desc')) { 
      result = name+' DESC'; 
     } else { 
      // continue 
     } 
    }); 
    return result; 
} 

function removeClasses(datatable, index) { 
    datatable.find('th').each(function() { 
     if($(this).index() !== index) { 
      $(this).removeClass().addClass('sorting'); 
     } 
    }); 
} 
+1

您正在處理服務器端的分頁,您還需要處理服務器端的搜索和排序。當你進行搜索/排序請求時,你可以在查詢字符串中看到相關參數,請參閱[這裏](https://www.datatables.net/manual/server-side)獲取完整列表 – markpsmith

+0

請你可以鏈接jsfiddle –

回答

7

你必須做的所有在服務器端的搜索&過濾。

對於搜索/過濾器或頁面的每個請求,數據表將所有這些作爲表單數據傳遞到服務器頁面。 參考https://www.datatables.net/manual/server-side

你將不得不使用這種形式的數據進行過濾/搜索/上記錄的SQL表相應分頁&它傳遞給客戶端。

數據表只顯示它從服務器獲得的內容。

+0

謝謝你的回答。我設法做搜索部分(請參閱編輯的原文),但我不知道如何管理過濾。你有想法嗎? – Pauloscorps

+0

這裏有一個php的服務器端腳本:https://www.datatables.net/examples/server_side/object_data.html –