Datatables的自然排序插件是否适用于通过服务器端处理获取数据的位置?

时间:2014-03-03 20:03:23

标签: sorting datatables natural-sort

我使用静态html数据,如jsfiddle所示:

http://jsfiddle.net/L7PNV/

指定

aoColumns: {"sType": "natural"}

当我对第一列进行排序时,它以右(自然排序)顺序显示行:

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
...

但是我希望将自然排序应用于服务器端获取数据的相同数据表,我调用数据表的代码与添加服务器端相关内容的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')

DataTable显示正常,但自然排序不能正常工作(如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

为什么会这样?自然排序插件是否与服务器端处理兼容?我该如何实施呢?

2 个答案:

答案 0 :(得分:1)

不,我会说,在进行服务器端处理时,您无法使用此插件。

只要从外部源检索数据,dataTables就会显示服务器上数据的窗口。这可能是数千行,这是服务器处理背后的整个想法。 dataTables只会向服务器发送带有一些信息的POSTGET请求,并且只返回适合当前视图的数据部分。由pagenumber和items_per_page压缩。

在服务器端也进行排序和过滤。因此,每次排序列时,dataTables都会向服务器发送请求,单击分页或应用过滤器。您可以(例如使用firebugs控制台查看此请求。您将找到ASC或DESC形式的每个行的实际页码,行/页数和排序信息。

让我们说你的服务器使用PHP和MYSQL然后php将获取这些数据,从LIMIT pagenumber*acutal_page, rows_per_pageORDER BY field, ASC/DESC的数据库中获取其字段。

所以在这种情况下,排序将由MySQL完成(虽然可能,但对自然排序不是很好)。

如果你使用mongoDB和/或node.js作为基础数据源,那么从dataTables实现(非常先进和令人敬畏的)排序算法应该相当容易,因为这是普通的javascript,可以由两者处理。

但这必须发生在服务器端,在客户端,dataTables只会看到服务器上大量数据的一小部分。

希望这有点帮助。

答案 1 :(得分:1)

只需修改' ssp.class.php '中的'静态函数顺序($ request,$ columns)'函数:

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

从现在开始,名称为“ Nr ”的列将具有自然排序。