如何在 CodeIgniter 中按类型(Deal/Coupon)分组渲染表格

如何在 CodeIgniter 中按类型(Deal/Coupon)分组渲染表格

本文介绍如何在 codeigniter 项目中将混合数据(如 deal 和 coupon)按类型分离,分别渲染为两个独立表格,避免视图层处理逻辑,遵循 mvc 分离原则,提升可维护性与性能。

在实际开发中,将不同业务类型的数据(如 deal_type == 0 表示 Deal,deal_type == 1 表示 Coupon)混在一个循环中渲染,不仅可读性差,也违背了“视图只负责展示”的设计准则。理想做法是:在控制器中完成数据预处理与分组,再将结构化数据传递给视图

✅ 推荐实现流程

1. 控制器层:分组并预加载关联数据

在控制器中,从模型获取原始结果后,主动按 deal_type 分组,并提前调用 get_likes() 等辅助函数,避免在视图中重复执行数据库/逻辑操作:

// 示例控制器代码(如 Admin_controller.php)
public function index() {
    $result = $this->your_model->get_all_coupons_and_deals(); // 假设返回对象数组

    $groups = [
        'Deals'   => [],
        'Coupons' => []
    ];

    foreach ($result as $row) {
        $type = ($row->deal_type == 0) ? 'Deals' : 'Coupons';

        // 预取 likes 数量,避免视图中调用函数
        $likes = get_likes($row->id);
        $likeCount = isset($likes[0]->likes) ? (int)$likes[0]->likes : 0;

        $groups[$type][] = (object)[
            'title'      => $row->deal_title,
            'created_at' => $row->created_at,
            'user_likes' => $likeCount,
            'status'     => $row->deal_status
        ];
    }

    $this->load->view('admin/coupons_deals_list', ['groups' => $groups]);
}

⚠️ 注意:get_likes() 若涉及数据库查询,请确保已做缓存或批量优化;若该函数未适配批量查询,建议重构为 get_likes_batch($ids) 提升效率。

2. 视图层:简洁、安全地渲染分组表格

视图不再包含条件判断和数据处理逻辑,仅专注 HTML 结构。使用 printf() 模板化输出,提高可读性与安全性(自动转义需配合 CI 的 esc() 辅助函数,此处为简化示例,生产环境建议对 title 等字段做 html_escape() 处理):

Runway

Runway

Runway是一个AI创意工具平台,它提供了一系列强大的功能,旨在帮助用户在视觉内容创作、设计和开发过程中提高效率和创新能力。

下载


        %d
        %s
        %s
        %s
        %s
        %s
    
HTML;

foreach ($groups as $groupName => $groupRows) {
    if (empty($groupRows)) continue; // 跳过空分组

    echo '

' . htmlspecialchars($groupName) . '

'; echo ''; echo ''; echo ''; foreach ($groupRows as $index => $row) { printf( $rowTemplate, $index + 1, htmlspecialchars(wordwrap($row->title, 25, "
/n")), htmlspecialchars($groupName), htmlspecialchars(strstr($row->created_at, ' ', true)), // 截取日期部分 htmlspecialchars($row->user_likes), $row->status == 1 ? 'Not published' : 'Published' ); } echo '
#TitleTypeDateLikesStatus

'; } ?>

✅ 优势总结

  • 职责清晰:控制器负责数据组织,视图专注呈现;
  • 性能更优:get_likes() 等操作只执行一次/每行一次,而非在视图中反复调用;
  • 易于扩展:新增类型(如 “Flash Sale”)只需修改分组键名,无需改动视图逻辑;
  • 便于测试:分组逻辑可单元测试,视图可独立进行 UI 测试;
  • SEO 与可访问性更友好:语义化

    + 独立

    更利于屏幕阅读器与搜索引擎解析。

    通过这种结构化方式,你不仅能优雅解决“显示两类数据”的需求,也为后续功能迭代(如分页、筛选、导出)打下坚实基础。

https://www.php.cn/faq/2003658.html

发表回复

Your email address will not be published. Required fields are marked *