jquery 数据表加载多行
jquery Datatable loading multiple rows
我正在使用 jquery 数据 table 将数据加载到我的 table:
https://datatables.net/examples/data_sources/server_side
我已经设置了一个 class 其中 returns 格式化的 json 字符串:
$columns = array(
array( 'db' => 'first_name', 'dt' => 0 ),
array( 'db' => 'last_name', 'dt' => 1 ),
array( 'db' => 'position', 'dt' => 2 ),
array( 'db' => 'office', 'dt' => 3 ),
array(
'db' => 'start_date',
'dt' => 4,
'formatter' => function( $d, $row ) {
return date( 'jS M y', strtotime($d));
}
),
array(
'db' => 'salary',
'dt' => 5,
'formatter' => function( $d, $row ) {
return '$'.number_format($d);
}
)
);
如何在数组中获取多个数据库?例如,我想在一个列中组合 first_name
和 last_name
。
你可以这样做,但我认为从服务器端来看它很复杂,至少使用数据表提供的 class 是这样。我也为您提供了从客户端执行此操作的选项,这要简单得多,但您选择
方案一,来自服务器端
如果您使用此处使用的代码参考,则不能这样做。
查看代码会发现传递给 SSP::simple 函数的 $columns 列表包含在反引号中,因此即使您尝试使用连接函数,它也会被视为列名,从而引发错误。
正如数据表本身在代码中所说:
The static functions in this class are just helper functions (...)
These functions obviously do not represent all that can be done with
server-side processing, they are intentionally simple to show how it
works.
因此,为了更加“定制化”,您可以编写自己的 server-side 处理器,它允许您生成带有函数的查询。
看起来像这样(基于当前的 ssp.class.php):
- 首先你改变了line 558中定义的pluck函数,所以当你传递一个数组时,它会调用concatenate函数
static function pluck ( $a, $prop )
{
$out = array();
for ( $i=0, $len=count($a) ; $i<$len ; $i++ ) {
if ( empty($a[$i][$prop]) && $a[$i][$prop] !== 0 ) {
continue;
}
// NEW CODE HERE, if an array is received, then concatenate it in the query
if (is_array($a[$i][$prop])) {
$out[$i] = "CONCAT(".implode(",",$a[$i][$prop]).") AS ".$prop;
}else {
//removing the $out array index confuses the filter method in doing proper binding,
//adding it ensures that the array data are mapped correctly
$out[$i] = $a[$i][$prop];
}
}
return $out;
}
- 然后更改 line 260 中的串联逻辑,删除反引号,以便列列表可以接受函数(这会降低安全性,并且会为包含空格的列抛出错误,如果您担心的话,您会必须做更多的改变)
$data = self::sql_exec( $db, $bindings,
"SELECT ".implode(", ", self::pluck($columns, 'db'))."
FROM `$table`
$where
$order
$limit"
);
- 最后你会像这样使用它
$columns = array(
array( 'db' => 'normal_column', 'dt' => 0 ),
array( 'db' => array('first_name', 'second_name'), 'dt' => 0 )
)
来自客户端的选项 2
这样更简单,因为 datatables 提供了一个呈现函数,您可以为您的列数据调用该函数,并且它可以访问所有其他列,因此您可以轻松地在前端连接它们。我看到的唯一缺点是你要从客户端处理它,如果你想从客户端卸载最大可能并在数据库上做大部分处理,你将不得不选择选项 1 ......但是我不认为几个连接会给你的前端增加很多开销
您可以在此处阅读:https://datatables.net/examples/advanced_init/column_render.html 您可以在配置中为所需的列声明一个行呈现函数。它看起来像这样(当然可以根据您的需要更改变量)
$(document).ready(function() {
$('#example').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "../server_side/scripts/server_processing.php",
"columnDefs": [
{
"render": function ( data, type, row ) {
return `${row["first_name"]} ${row["last_name"]}`;
// return `${row[1]} ${row[2]}`; // if your data is sequential
},
"targets": 0 // index of your target column
}
]
} );
} );
如果你想要这个,不是在单元格中而是在详细信息行中,数据表站点中也有一个很好的例子 https://datatables.net/examples/server_side/row_details.html
祝你好运
我正在使用 jquery 数据 table 将数据加载到我的 table: https://datatables.net/examples/data_sources/server_side
我已经设置了一个 class 其中 returns 格式化的 json 字符串:
$columns = array(
array( 'db' => 'first_name', 'dt' => 0 ),
array( 'db' => 'last_name', 'dt' => 1 ),
array( 'db' => 'position', 'dt' => 2 ),
array( 'db' => 'office', 'dt' => 3 ),
array(
'db' => 'start_date',
'dt' => 4,
'formatter' => function( $d, $row ) {
return date( 'jS M y', strtotime($d));
}
),
array(
'db' => 'salary',
'dt' => 5,
'formatter' => function( $d, $row ) {
return '$'.number_format($d);
}
)
);
如何在数组中获取多个数据库?例如,我想在一个列中组合 first_name
和 last_name
。
你可以这样做,但我认为从服务器端来看它很复杂,至少使用数据表提供的 class 是这样。我也为您提供了从客户端执行此操作的选项,这要简单得多,但您选择
方案一,来自服务器端
如果您使用此处使用的代码参考,则不能这样做。 查看代码会发现传递给 SSP::simple 函数的 $columns 列表包含在反引号中,因此即使您尝试使用连接函数,它也会被视为列名,从而引发错误。
正如数据表本身在代码中所说:
The static functions in this class are just helper functions (...) These functions obviously do not represent all that can be done with server-side processing, they are intentionally simple to show how it works.
因此,为了更加“定制化”,您可以编写自己的 server-side 处理器,它允许您生成带有函数的查询。
看起来像这样(基于当前的 ssp.class.php):
- 首先你改变了line 558中定义的pluck函数,所以当你传递一个数组时,它会调用concatenate函数
static function pluck ( $a, $prop )
{
$out = array();
for ( $i=0, $len=count($a) ; $i<$len ; $i++ ) {
if ( empty($a[$i][$prop]) && $a[$i][$prop] !== 0 ) {
continue;
}
// NEW CODE HERE, if an array is received, then concatenate it in the query
if (is_array($a[$i][$prop])) {
$out[$i] = "CONCAT(".implode(",",$a[$i][$prop]).") AS ".$prop;
}else {
//removing the $out array index confuses the filter method in doing proper binding,
//adding it ensures that the array data are mapped correctly
$out[$i] = $a[$i][$prop];
}
}
return $out;
}
- 然后更改 line 260 中的串联逻辑,删除反引号,以便列列表可以接受函数(这会降低安全性,并且会为包含空格的列抛出错误,如果您担心的话,您会必须做更多的改变)
$data = self::sql_exec( $db, $bindings,
"SELECT ".implode(", ", self::pluck($columns, 'db'))."
FROM `$table`
$where
$order
$limit"
);
- 最后你会像这样使用它
$columns = array(
array( 'db' => 'normal_column', 'dt' => 0 ),
array( 'db' => array('first_name', 'second_name'), 'dt' => 0 )
)
来自客户端的选项 2
这样更简单,因为 datatables 提供了一个呈现函数,您可以为您的列数据调用该函数,并且它可以访问所有其他列,因此您可以轻松地在前端连接它们。我看到的唯一缺点是你要从客户端处理它,如果你想从客户端卸载最大可能并在数据库上做大部分处理,你将不得不选择选项 1 ......但是我不认为几个连接会给你的前端增加很多开销
您可以在此处阅读:https://datatables.net/examples/advanced_init/column_render.html 您可以在配置中为所需的列声明一个行呈现函数。它看起来像这样(当然可以根据您的需要更改变量)
$(document).ready(function() {
$('#example').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "../server_side/scripts/server_processing.php",
"columnDefs": [
{
"render": function ( data, type, row ) {
return `${row["first_name"]} ${row["last_name"]}`;
// return `${row[1]} ${row[2]}`; // if your data is sequential
},
"targets": 0 // index of your target column
}
]
} );
} );
如果你想要这个,不是在单元格中而是在详细信息行中,数据表站点中也有一个很好的例子 https://datatables.net/examples/server_side/row_details.html
祝你好运