2014-03-03 24 views
0

我得到了它與靜態的HTML數據的工作如本的jsfiddle:Datatables的自然排序插件是否可以在服務器端處理數據的地方工作?

通過指定

aoColumns: {"sType": "natural"} 

在那裏,當我對它進行排序顯示在右邊行的第一列

http://jsfiddle.net/L7PNV/

(天然 - 排序)的順序:

SIR_1_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1  
SIR_2_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1  
SIR_3_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1  
SIR_10_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1 
... 

但是,然後我想應用自然排序到這個數據表中的數據是fe tched服務器端,在那裏我調用數據表中的代碼是一樣的,在的jsfiddle添加服務器端有關的東西:

$ -> 
    $("#sir_table").dataTable 
    sPaginationType: "full_numbers" 
    bProcessing: true 
    bServerSide: true 
    aoColumns: [{"sType": "natural"}, {"sType": "natural"}, {"sType": "natural"} ] 
    aaSorting: [[ 1, "asc" ]] 
    sAjaxSource: $('#sir_table').data('source') 

的數據表顯示正常的,但自然排序不工作,因爲它應該(像在jsfiddle中,如上)。而是顯示行:

SIR_1_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1  
SIR_10_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1 
... 
SIR_19_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1 
SIR_2_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1 
SIR_20_SIL_CGG_2011_224_SILAC1b_IMAC_Fr1 

爲什麼會發生這種情況?自然排序插件是否與服務器端處理兼容?我應該如何實現它?

回答

1

不,我會說,在進行服務器端處理時不能使用此插件。

只要您從外部來源檢索數據dataTables只會顯示服務器上的數據窗口。這可能是成千上萬的行,這是服務器處理背後的整個想法。 dataTables只會向服務器發送一個POSTGET請求以及一些信息,並且只返回適合當前視圖的數據部分。被pagenumber和items_per_page夾緊。

排序和過濾也在服務器端完成。因此,每當您對列進行排序時,dataTables都會向服務器發送請求,單擊分頁或應用過濾器。你可以(例如使用螢火蟲控制檯查看這個請求,你可以找到實際的頁碼,行數/頁面以及以ASC或DESC形式的每一行的排序信息。說你的服務器使用PHP和MYSQL那麼PHP將藉此數據,從數據庫中獲取其字段LIMIT pagenumber*acutal_page, rows_per_pageORDER BY field, ASC/DESC

因此,在這種情況下,排序會被MySQL來完成(這不是自然排序非常好,儘管它是可能的)

如果你使用mongoDB和/或node.js作爲基礎數據源,它應該相當容易實現(非常先進和真棒)排序算法f ROM dataTables,因爲這是可以由兩者處理的普通JavaScript。

但是這必須發生在服務器端,在客戶端,dataTables只會看到服務器上大量數據的一小部分。

希望這會有所幫助。

+0

我終於用自己的自定義排序功能做了服務器端的所有排序,你可能是對的,在我的情況下,在客戶端進行排序是沒有意義的。謝謝你的深思熟慮的答案 –

1

只需在'ssp.class中修改'靜態函數順序($ request,$ columns)'函數。PHP「:

if ($column['db'] == 'Nr') { 
    // Natural Sort 
    $orderBy[] = 'LENGTH(`' . $column['db'] . '`) ' . $dir . ', ' . '`' . $column['db'] . '` ' . $dir; 
} else { 
    $orderBy[] = '`' . $column['db'] . '` ' . $dir; 
} 

從現在起的名稱列」 上午十時正「會有自然排序。

相關問題