Server Side DataTables Ajax加载:如何在formatter中访问外部变量
解决Server Side DataTables formatter访问外部变量/资源的问题
1. 访问外部数组(如$lang)
PHP匿名函数默认不会捕获父作用域的变量,且DataTables的ssp.class.php调用formatter时只会传入$d(当前字段值)和$row(整行数据)两个参数,因此不能自行新增参数。正确的做法是使用use关键字引入外部变量:
// 外部定义的多语言数组 $lang = [ 'maschio' => '男', 'femmina' => '女', 'azienda' => '企业' ]; // DataTables列配置 array( 'db' => 'genere', 'dt' => 0, 'formatter' => function( $d, $row ) use ($lang) { // 通过use引入$lang $gender = ''; if($d=='M'){ $gender = $lang['maschio']; }else if($d=='F'){ $gender = $lang['femmina']; }else if($d=='A'){ $gender = $lang['azienda']; } return $gender; } );
如果需要在函数内修改外部变量,需在use中添加引用符号&,如use(&$lang),仅读取的话无需添加。
2. 访问数据库连接/查询其他表
同样通过use关键字将数据库连接实例传入formatter,即可在函数内执行查询操作:
// 已初始化的PDO数据库连接实例 $pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password'); // DataTables列配置 array( 'db' => 'user_id', 'dt' => 2, 'formatter' => function( $d, $row ) use ($pdo) { // 引入数据库连接 // 查询关联表数据 $stmt = $pdo->prepare("SELECT role_name FROM roles WHERE user_id = ?"); $stmt->execute([$d]); $role = $stmt->fetch(PDO::FETCH_ASSOC); return $role ? $role['role_name'] : '无角色'; } );
性能优化提示
如果每一行都执行单条查询会导致数据库压力过大,建议提前批量查询所需数据并缓存为映射数组,再在formatter中直接读取:
// 提前批量获取所有用户的角色映射 $stmt = $pdo->query("SELECT user_id, role_name FROM roles"); $roleMap = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $roleMap[$row['user_id']] = $row['role_name']; } // formatter中直接使用预缓存的映射数组 'formatter' => function( $d, $row ) use ($roleMap) { return $roleMap[$d] ?? '无角色'; }
若使用ssp.class.php自带的数据库连接,可查看类内部的连接属性(部分版本会将连接存在$db变量中),将其传递到formatter所在作用域后,再通过use引入。
内容的提问来源于stack exchange,提问作者Samiran Chakraborty
相关产品推荐
相关产品推荐

