# 统一导出模板
# 概述
本模板提供两种导出方式的实现方案:
- 队列导出(推荐) - 异步批量导出,配置简单,性能好
- 传统同步导出 - 实时导出,配置复杂,适合小数据量
# 队列导出(推荐方案)
# 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
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
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
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
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条
- 实时性要求 - 需要立即看到导出结果
- 简单字段 - 字段处理逻辑简单
# 实施步骤
- 选择导出方式 - 根据业务需求选择队列导出或传统导出
- 配置控制器 - 启用
use_buildin_export - 配置模型 - 按对应方案配置模型
- 测试验证 - 测试导出功能是否正常
# 注意事项
- 队列导出需要确保队列系统正常运行
- 传统导出注意内存限制,大数据量可能导致超时
- 字段映射要确保数据库字段存在
- 导出文件名会自动添加时间戳