# 统一导出模板

# 概述

本模板提供两种导出方式的实现方案:

  1. 队列导出(推荐) - 异步批量导出,配置简单,性能好
  2. 传统同步导出 - 实时导出,配置复杂,适合小数据量

# 队列导出(推荐方案)

# 1. 控制器配置

class xxx_ctl_admin_xxx extends desktop_controller
{
    public function index()
    {
        $params = array(
            'title'                  => '业务列表',
            'use_buildin_export'     => true,  // 启用系统内置导出
            'use_buildin_new_dialog' => false,
            'use_buildin_set_tag'    => false,
            'use_buildin_recycle'    => false,
            'use_buildin_import'     => false,
        );
        $this->finder('xxx_mdl_xxx', $params);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 2. 模型配置(最简)

class xxx_mdl_xxx extends dbeav_model
{
    // 导出配置
    var $has_export_cnf = true;
    var $export_name = '业务名称';

    // 队列导出核心方法
    public function getExportDetailV2($list, $colArray) {
        // 处理数据,可以根据需要添加字段值转换逻辑
        foreach ($list as &$row) {
            // 示例:处理特殊字段
            if (isset($row['status'])) {
                $row['status'] = $row['status'] == '1' ? '启用' : '禁用';
            }
            if (isset($row['createtime'])) {
                $row['createtime'] = date('Y-m-d H:i:s', $row['createtime']);
            }
        }
        
        // 返回 [$list, $colArray] 格式
        return array($list, $colArray);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 3. 特点

  • 配置简单 - 只需2个属性和1个方法
  • 字段灵活 - 字段完全由外部传入,无需写死
  • 性能优秀 - 异步处理,支持大数据量
  • 维护方便 - 代码量少,逻辑清晰

# 传统同步导出(备选方案)

# 1. 控制器配置

class xxx_ctl_admin_xxx extends desktop_controller
{
    public function index()
    {
        $params = array(
            'title'                  => '业务列表',
            'use_buildin_export'     => true,
            'use_buildin_new_dialog' => false,
            'use_buildin_set_tag'    => false,
            'use_buildin_recycle'    => false,
            'use_buildin_import'     => false,
        );
        $this->finder('xxx_mdl_xxx', $params);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 2. 模型配置(完整)

class xxx_mdl_xxx extends dbeav_model
{
    var $has_export_cnf = true;
    var $export_name = '业务名称';

    // 导出字段映射
    function io_title($filter = null, $ioType = 'csv') {
        $this->oSchema['csv']['xxx'] = array(
            '*:字段1' => 'field1',
            '*:字段2' => 'field2',
            // ... 更多字段
        );
        
        $this->ioTitle[$ioType]['xxx'] = array_keys($this->oSchema[$ioType]['xxx']);
        return $this->ioTitle[$ioType][$filter ?: 'xxx'];
    }

    // 数据统计
    public function fcount_csv($filter) {
        return $this->count($filter);
    }

    // 分页数据获取
    function fgetlist_csv(&$data, $filter, $offset, $exportType = 1) {
        $limit = 100;
        $list = $this->getList('*', $filter, $offset * $limit, $limit);
        
        if (!$list) return false;
        
        $colArray = array_keys($this->oSchema['csv']['xxx']);
        $exportData = $this->getExportDetailV2($list, $colArray);
        
        foreach ($exportData as $row) {
            $data['content']['xxx'][] = $this->charset->utf2local('"' . implode('","', $row) . '"');
        }
        
        return true;
    }

    // 数据处理
    public function getExportDetailV2($list, $colArray) {
        $exportData = array();
        foreach ($list as $row) {
            $exportRow = array();
            foreach ($colArray as $title) {
                $field = $this->oSchema['csv']['xxx'][$title];
                $value = $this->_getFieldValue($row, $field);
                $exportRow[] = $value;
            }
            $exportData[] = $exportRow;
        }
        return $exportData;
    }

    // 字段值处理
    private function _getFieldValue($row, $field) {
        $value = isset($row[$field]) ? $row[$field] : '';
        
        // 特殊字段处理
        switch ($field) {
            case 'status':
                $value = $value == '1' ? '启用' : '禁用';
                break;
            case 'createtime':
                if ($value) {
                    $value = date('Y-m-d H:i:s', $value);
                }
                break;
        }
        
        return $value;
    }

    // CSV输出
    function export_csv($data) {
        $output = array();
        foreach ($data['title'] as $k => $val) {
            $output[] = $val . "\n" . implode("\n", (array) $data['content'][$k]);
        }
        echo implode("\n", $output);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

# 选择建议

# 推荐使用队列导出

  • 新项目 - 优先选择队列导出
  • 大数据量 - 必须使用队列导出
  • 性能要求高 - 队列导出性能更好

# 传统同步导出适用场景

  • 小数据量 - 数据量小于1000条
  • 实时性要求 - 需要立即看到导出结果
  • 简单字段 - 字段处理逻辑简单

# 实施步骤

  1. 选择导出方式 - 根据业务需求选择队列导出或传统导出
  2. 配置控制器 - 启用 use_buildin_export
  3. 配置模型 - 按对应方案配置模型
  4. 测试验证 - 测试导出功能是否正常

# 注意事项

  • 队列导出需要确保队列系统正常运行
  • 传统导出注意内存限制,大数据量可能导致超时
  • 字段映射要确保数据库字段存在
  • 导出文件名会自动添加时间戳
最后更新: 11/11/2025, 9:12:34 PM