You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:05:23