
本文详细介绍了如何在DataTables的服务器端处理中,利用`ssp.class.php`的`formatter`功能添加非直接来源于数据库的计算列。通过配置`$columns`数组并编写自定义的格式化函数,开发者可以根据现有数据动态生成新列内容,从而增强表格的数据展示能力,实现更灵活的数据处理和呈现。
在构建动态数据表格时,DataTables结合服务器端处理(Server-side Processing)是处理大量数据的常用模式。ssp.class.php是DataTables官方提供的一个PHP辅助类,极大地简化了服务器端逻辑的编写。然而,在某些场景下,我们需要在表格中展示一些并非直接存储在数据库中,而是通过现有数据计算得出的列。本文将指导您如何在DataTables服务器端处理中,优雅地实现这一需求。
理解DataTables服务器端列定义
在使用ssp.class.php时,核心在于定义一个$columns数组,它将数据库列与DataTables的列索引进行映射。每个数组元素通常包含db(数据库列名)和dt(DataTables列索引)两个键。
$columns = array(
array( 'db' => 'first_name', 'dt' => 0 ),
array( 'db' => 'last_name', 'dt' => 1 ),
array( 'db' => 'position', 'dt' => 2 )
);
对于需要进行格式化的列,ssp.class.php提供了formatter键,允许您定义一个匿名函数来处理从数据库获取的原始数据。这个函数接收两个参数:$d(当前列的原始数据)和$row(当前行的所有数据,以关联数组形式提供)。
array(
'db' => 'start_date',
'dt' => 4,
'formatter' => function( $d, $row ) {
return date( 'jS M y', strtotime($d));
}
)
添加计算列的核心策略
要添加一个非数据库字段的计算列,我们主要利用formatter函数的强大功能。关键在于:
- 定义计算列的DataTables索引 (dt):为新列分配一个唯一的DataTables列索引。
- 选择一个合适的db字段:对于纯粹的计算列,db字段可以设置为一个实际存在的、但其值在计算中可能被忽略的数据库列(例如主键id),或者如果ssp.class.php支持,甚至可以为空字符串。重要的是,formatter函数中的$row参数将包含该行所有已定义的数据库列数据,这正是我们进行计算的基础。
- 编写formatter函数:在这个函数中,您可以访问$row数组中的其他列数据,执行您的计算逻辑,并返回最终的显示值。
示例:添加“评级”计算列
假设我们希望根据员工的salary(薪水)计算并显示一个“评级”列。salary是数据库中的一个字段,但“评级”不是。
首先,确保salary列已被包含在$columns定义中,这样它的值才能通过$row参数传递给formatter。
<?php
// 引入 ssp.class.php
require( 'ssp.class.php' );
$table = 'datatables_demo';
$primaryKey = 'id';
$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', // 确保 salary 列被选中,以便在计算中使用
'dt' => 5,
'formatter' => function( $d, $row ) {
return '$'.number_format($d);
}
),
// 添加计算列:评级
array(
'db' => 'id', // 可以是任何已存在的数据库列,其原始值 $d 在此列中可能不被直接使用
// 关键在于 $row 包含了所有选中的数据
'dt' => 6, // DataTables 中的列索引,确保唯一且按顺序
'formatter' => function( $d, $row ) {
// 从 $row 数组中获取 'salary' 值进行计算
$salary = isset($row['salary']) ? (int)$row['salary'] : 0;
if ($salary > 100000) {
return '优秀';
} elseif ($salary > 50000) {
return '良好';
} else {
return '一般';
}
}
)
);
$sql_details = array(
'user' => 'your_db_user',
'pass' => 'your_db_password',
'db' => 'your_db_name',
'host' => 'localhost'
);
echo json_encode(
SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns )
);
?>
在上述代码中:
- 我们为“评级”列分配了dt => 6。
- db => ‘id’:这里我们使用了id作为db字段。ssp.class.php会查询id列,但它的值$d在formatter中并未直接用于生成“评级”。
- 在formatter函数内部,我们通过$row[‘salary’]访问了同一行中的薪水数据,并据此逻辑返回了“优秀”、“良好”或“一般”的评级。
客户端DataTables配置
在服务器端添加了计算列后,客户端的DataTables初始化代码也需要相应更新,以反映新增的列。您需要在JavaScript的columns数组中为新列添加一个定义。
$(document).ready(function() {
$('#example').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "your_server_side_script.php", // 指向您的 PHP 脚本
"columns": [
{ "data": 0 }, // first_name
{ "data": 1 }, // last_name
{ "data": 2 }, // position
{ "data": 3 }, // office
{ "data": 4 }, // start_date (已格式化)
{ "data": 5 }, // salary (已格式化)
{ "data": 6 } // rating (计算列)
]
} );
} );
注意事项与最佳实践
- 性能考量:虽然formatter函数非常灵活,但如果您的计算逻辑非常复杂或涉及大量数据,可能会对服务器性能造成影响。在这种情况下,考虑是否可以在数据库层面(例如使用SQL视图或存储过程)预先计算部分数据。
- 依赖性:确保计算列所依赖的所有数据库列都已包含在$columns数组中,以便它们的值可以通过$row参数传递给formatter。
- 错误处理:在formatter函数中,对可能不存在的$row键进行检查(例如使用isset()),以避免因数据缺失而导致的PHP错误。
- db字段的选择:对于纯粹的计算列,db字段的选择主要是为了满足ssp.class.php内部查询的需要。只要该字段能被正确查询,并且您主要依赖$row来获取数据,那么选择哪个字段通常影响不大。使用主键如id是一个常见的做法。
总结
通过巧妙地利用ssp.class.php提供的formatter功能,您可以轻松地在DataTables的服务器端处理中集成非数据库的计算列。这种方法不仅保持了数据表格的灵活性,也使得数据展示更加丰富和动态。理解formatter函数中$d和$row参数的用法是实现这一目标的关键。
以上就是DataTables服务器端处理:集成非数据库计算列的详细内容,更多请关注php中文网其它相关文章!


