应拆分,list.php仅组织结构,_table_head.php渲染表头,_table_row.php渲染单行,_pagination.php独立分页组件,按数据渲染职责切分而非html层级,所有子视图须显式传参、禁用内部查库。

表格列表页的视图要不要拆成多个文件
直接在 list.php 里写完 HTML 表格 + 分页 + 搜索表单 + 操作按钮,短期快,长期难维护。尤其当同一张表要复用于后台管理页、API 响应前的预览页、或导出 PDF 的数据源时,硬编码会导致重复逻辑和样式错位。
拆是必要的,但不是“为拆而拆”。核心原则:按「数据渲染职责」切分,不是按「HTML 标签层级」切分。
-
list.php只负责组织结构:加载头部、主表格区、分页区、脚部,不写任何<tr> 或字段逻辑 <li> <code>_table_head.php渲染表头(含排序箭头、可点击列名),接收$sort_by和$sort_order参数 -
_table_row.php渲染单行,接收$row数组,内部用isset($row['status'])判断字段是否存在,避免 Notice -
_pagination.php独立分页组件,接收$total_rows、$per_page、$current_page,不耦合 CI 的$this->pagination对象 - 所有子视图必须通过父视图显式传参,禁止在子视图里调用
$this->load->model() - 用键名明确语义,比如传表格行数据时用
'rows' => $query->result_array(),别用'data'这种模糊名 - 如果某子视图需要额外上下文(如权限判断),提前在控制器组装好,例如
$data['can_edit'] = $this->auth->has_permission('edit_user'),再一起传入 - 避免在子视图中修改传入数组,CI 不做深拷贝,改了会影响其他地方引用
- 检查
config/pagination.php中$config['uri_segment']是否设为对应分页数字所在段,比如 URL 是/users/page/2,就要设3 - 控制器里调用
$this->pagination->initialize($config)后,必须紧接着用$this->pagination->create_links(),不能只初始化不调用 - 子视图
_pagination.php中输出链接时,确保 href 里的页码值来自$config['cur_page'],而不是硬写page/2 - CI 3.x 默认把分页参数当 URI 段处理,若你用查询参数方式(如
?page=2),得设$config['use_page_numbers'] = TRUE并重写base_url - 所有公共 CSS/JS 统一在主布局文件(如
templates/admin.php)里加载,子视图禁止插入<link> - 如果某子视图需要专属 JS(比如行内编辑),用
<script></script>块包裹逻辑,但把函数定义抽到公共 JS 文件,子视图只调用 - 避免在
_table_row.php里写<script>console.log(...)</script>,大量重复执行会拖慢渲染 - CI 的
$this->load->view()是顺序执行,所以子视图里的 JS 如果依赖 jQuery,必须确认主布局已先加载 jQuery
怎么传数据给子视图才不乱
CI 的 $this->load->view() 支持第二参数传数组,但嵌套深了容易覆盖或遗漏。常见错误是父视图里用 $data['items'] = $items,子视图又自己查一遍数据库——既慢又可能数据不一致。
分页链接生成为什么总跳转到首页
典型表现:点第2页,URL 变成 /admin/users/page/2,但页面仍显示第1页数据。根本原因是分页类没读到当前页码,或 URI 路由没配对。
模板拆了之后 CSS 和 JS 加载顺序错乱
拆成多个 PHP 文件后,经常出现表格样式失效、分页按钮无响应——不是代码问题,是资源加载时机不对。CI 不自动合并或去重 <link> 和 <script></script>。
_table_row.php 开始查数据库或调用模型方法,整个拆分就退化成更难 debug 的拼图。











