基于CodeIgniter 4与Shield权限构建HTML表格的问题求助
CodeIgniter Shield 权限表格修复方案
环境与需求
基于CodeIgniter 4.3.3、Shield 1.0.0-beta.5及MySQL,需结合auth_permissions_users、sidebar_modules、sidebar_modules_sub三张表构建HTML权限表格,权限格式采用controller.permission替代Shield默认的Group.Permission。
现有问题
- 用户缺失的权限未在表格中填充,导致列结构不完整
- 权限顺序受数据库存储影响,表格列出现错位
解决步骤
1. 定义固定权限操作与列顺序
先明确固定的权限操作集合和表头顺序,彻底规避数据库存储顺序的干扰:
// 固定权限操作,严格按要求顺序排列 $fixedActions = ['create', 'read', 'update', 'delete']; // 固定表头列顺序 $tableColumns = ['控制器', '创建', '读取', '更新', '删除'];
2. 补全用户缺失的权限
遍历所有控制器,对每个控制器的每类操作权限逐一检查,若用户未拥有该权限,则补全为未授权状态:
// 从sidebar_modules获取所有控制器列表 $controllers = $db->table('sidebar_modules')->get()->getResultArray(); // 将用户已拥有的权限转为键值对,方便快速查找 $userPermissions = array_column($userPermissions, null, 'permission'); // 整理完整权限数据 $completePermissions = []; foreach ($controllers as $module) { $controllerName = $module['controller']; $controllerPermissions = ['controller' => $controllerName]; // 遍历固定操作,补全缺失权限 foreach ($fixedActions as $action) { $permissionKey = "{$controllerName}.{$action}"; // 存在则取用户权限状态,不存在则设为未授权(示例用0表示) $controllerPermissions[$action] = isset($userPermissions[$permissionKey]) ? $userPermissions[$permissionKey]['allowed'] : 0; } $completePermissions[] = $controllerPermissions; }
3. 按固定顺序渲染表格
基于整理好的完整权限数据,严格按照$tableColumns的顺序生成表头和表格内容:
// 生成HTML表格 $html = '<table class="permission-table">'; // 渲染表头 $html .= '<thead><tr>'; foreach ($tableColumns as $column) { $html .= "<th>{$column}</th>"; } $html .= '</tr></thead>'; // 渲染表格内容 $html .= '<tbody>'; foreach ($completePermissions as $row) { $html .= '<tr>'; // 先输出控制器名称 $html .= "<td>{$row['controller']}</td>"; // 按固定操作顺序输出权限状态(示例用复选框展示) foreach ($fixedActions as $action) { $checked = $row[$action] ? 'checked' : ''; $html .= "<td><input type='checkbox' name='permissions[]' value='{$row['controller']}.{$action}' {$checked}></td>"; } $html .= '</tr>'; } $html .= '</tbody></table>'; return $html;
修改后的完整buildPermissionsTable函数
if (!function_exists('buildPermissionsTable')) { function buildPermissionsTable($userId) { $db = \Config\Database::connect(); // 定义固定权限操作与列顺序 $fixedActions = ['create', 'read', 'update', 'delete']; $tableColumns = ['控制器', '创建', '读取', '更新', '删除']; // 获取用户已拥有的权限 $userPermissions = $db->table('auth_permissions_users') ->where('user_id', $userId) ->get() ->getResultArray(); $userPermissions = array_column($userPermissions, null, 'permission'); // 获取所有控制器(可按模块排序,保持控制器展示顺序一致) $controllers = $db->table('sidebar_modules') ->orderBy('order', 'asc') ->get() ->getResultArray(); // 补全缺失权限 $completePermissions = []; foreach ($controllers as $module) { $controller = $module['controller']; $permissionRow = ['controller' => $controller]; foreach ($fixedActions as $action) { $permKey = "{$controller}.{$action}"; $permissionRow[$action] = isset($userPermissions[$permKey]) ? $userPermissions[$permKey]['allowed'] : 0; } $completePermissions[] = $permissionRow; } // 生成HTML表格 $html = '<table border="1" cellpadding="8" cellspacing="0">'; // 渲染表头 $html .= '<tr>'; foreach ($tableColumns as $col) { $html .= "<th>{$col}</th>"; } $html .= '</tr>'; // 渲染内容行 foreach ($completePermissions as $row) { $html .= '<tr>'; $html .= "<td>{$row['controller']}</td>"; foreach ($fixedActions as $action) { $checked = $row[$action] ? 'checked' : ''; $html .= "<td><input type='checkbox' {$checked} data-perm='{$row['controller']}.{$action}'></td>"; } $html .= '</tr>'; } $html .= '</table>'; return $html; } }
修改后,既能保证所有控制器的四类权限都被填充(缺失权限默认显示为未勾选),又能严格按照指定顺序排列列,彻底解决数据库存储顺序导致的列错位问题。
内容的提问来源于stack exchange,提问作者DeanE10
相关产品推荐
相关产品推荐

