如何在DataTables中根据权限控制操作列的显示与隐藏
解决DataTables根据权限动态隐藏/显示操作列的问题
需求是根据后端返回的actions字段值,动态控制DataTables操作列的显示:当所有行的actions为空时隐藏该列,存在非空值时显示对应操作内容。结合你提供的前后端代码,以下是实现方案:
核心思路
先判断是否存在有权限的操作内容,再决定是否渲染操作列。推荐两种实用实现方式:
方式一:先获取数据,动态构建列配置
手动请求后端数据,判断是否需要显示操作列后,动态构建DataTables的列配置,再初始化表格(更高效,避免冗余列渲染)。
修改后的前端代码:
$(document).ready(function(){ // 先请求用户数据 $.ajax({ url: 'Users/getusers', dataType: 'json', success: function(data) { // 判断是否存在包含操作内容的行 var hasActions = data.some(row => row.actions?.trim() !== ''); // 基础列配置 var columns = [ {data: 'firstname'}, {data: 'middlename'}, {data: 'lastname'}, {data: 'username'}, {data: 'mobileno'}, {data: 'statusname'}, {data: 'groupname'} ]; // 如果有操作权限,追加操作列 if (hasActions) { columns.push({data: 'actions'}); } // 初始化DataTables $("#userTable").DataTable({ pageLength: 25, lengthMenu: [25, 50, 75, 100], dom: '<"top"lfB>rt<"bottom"p><"clear">', buttons: ['copy', 'excel', 'pdf', 'print'], data: data, columns: columns }); } }); });
方式二:利用DataTables的ajax回调动态隐藏列
如果想保留DataTables自带的ajax配置,可以通过dataSrc回调判断权限,再隐藏操作列:
$(document).ready(function(){ $("#userTable").DataTable({ pageLength: 25, lengthMenu: [25, 50, 75, 100], dom: '<"top"lfB>rt<"bottom"p><"clear">', buttons: ['copy', 'excel', 'pdf', 'print'], ajax: { url: 'Users/getusers', dataSrc: function(json) { // 判断是否存在非空的actions var hasActions = json.some(row => row.actions?.trim() !== ''); // 操作列的索引是7(从0开始计数) if (!hasActions) { $("#userTable").DataTable().column(7).visible(false); } return json; } }, columns: [ {data: 'firstname'}, {data: 'middlename'}, {data: 'lastname'}, {data: 'username'}, {data: 'mobileno'}, {data: 'statusname'}, {data: 'groupname'}, {data: 'actions'} ] }); });
可选:后端优化(提升效率)
当前后端给每行生成actions,可以额外返回一个全局权限标识,避免前端遍历所有行:
修改后端PHP代码:
$data = $this->userModal->userslist(); // 提前判断全局权限 $hasEditPermission = ChechPermission($this->session->userdata('permissions'), "users", "edit"); foreach($data as $d){ if($hasEditPermission) { $d->actions =' <a href="Users/edit/'.$d->userid.'" class="btn btn-success btn-md"><i class="fas fa-pen-square"></i></a> '; } else { $d->actions = ''; } } // 把权限标识和数据一起返回 echo json_encode([ 'data' => $data, 'hasEditPermission' => $hasEditPermission ]);
对应前端修改(以方式二为例):
ajax: { url: 'Users/getusers', dataSrc: function(json) { var hasActions = json.hasEditPermission; if (!hasActions) { $("#userTable").DataTable().column(7).visible(false); } return json.data; } }
内容的提问来源于stack exchange,提问作者user6282287
相关产品推荐
相关产品推荐

