forked from m35mai/yii2-thecsv
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththeCsv.php
104 lines (97 loc) · 4.5 KB
/
theCsv.php
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
namespace panrus\thecsv;
class theCsv {
public static function export($parameter)
{
if (is_string($parameter)) {
$parameter = ['table' => $parameter];
}
if (is_array($parameter)) {
if ( ! empty($parameter['table'])) {
$db= \Yii::$app->getDb();
$tables = $db->schema->getTableNames();
if ( ! in_array($parameter['table'], $tables)) {
throw new \yii\web\HttpException(500, "table '{$parameter['table']}' not exists!");
}
$query = (new \yii\db\Query)->from($parameter['table']);
if ( ! empty($parameter['limit'])) {
$query->limit($parameter['limit']);
}
if ( ! empty($parameter['offset'])) {
$query->offset($parameter['offset']);
}
if ( ! empty($parameter['orderby'])) {
$query->orderBy($parameter['orderby']);
}
if ( ! empty($parameter['condition'])) {
$query->where($parameter['condition']);
}
if ( ! empty($parameter['fields'])) {
$columns = $db->getSchema()->getTableSchema($parameter['table'])->getColumnNames();
$parameter['fields'] = array_intersect($parameter['fields'], $columns);
if ( ! empty($parameter['exceptFields'])) {
$parameter['fields'] = array_diff($columns, $parameter['fields']);
}
$query->select($parameter['fields']);
}
if (empty($parameter['header'])) {
$parameter['header'] = [];
foreach($db->getSchema()->getTableSchema($parameter['table'])->columns as $item) {
if (empty($parameter['fields']) or (! empty($parameter['fields']) && in_array($item->name, $parameter['fields']))) {
$parameter['header'][] = (empty($item->comment) ? \yii\helpers\Inflector::camel2words($item->name, true) : $item->comment) . '(' . $item->name . ')';
}
}
}
if (empty($parameter['name'])) {
$parameter['name'] = $parameter['table'] . '.csv';
}
} elseif ( ! empty($parameter['sql'])) {
$db= \Yii::$app->getDb();
$command = $db->createCommand($parameter['sql']);
if ( ! empty($parameter['bind'])) {
$command->bindValues($parameter['bind']);
}
$reader = $command->query();
} elseif (! empty($parameter['query']) && empty($query)) {
$query = $parameter['query'];
} elseif (! empty($parameter['reader']) && empty($reader)) {
$reader = $parameter['reader'];
} elseif (empty($parameter['data'])) {
throw new \yii\web\HttpException(500, "Not a valid parameter!");
}
if (empty($parameter['name'])) {
$parameter['name'] = date('Y-m-d_H-i-s') . '.csv';
}
if ( ! empty($parameter['fp']) && is_resource($parameter['fp'])) {
$fp =& $parameter['fp'];
} else {
if ( ! empty($parameter['target'])) {
$fp = fopen($parameter['target'] . $parameter['name'], 'w');
} else {
header('Content-Type: text/csv');
header("Content-Disposition: attachment;filename={$parameter['name']}");
$fp = fopen('php://output', 'w');
}
}
fwrite($fp,chr(0xEF).chr(0xBB).chr(0xBF));
if ( ! empty($parameter['header']) && is_array($parameter['header'])) {
fputcsv($fp, $parameter['header']);
}
if (isset($query)) {
foreach ($query->each() as $row) {
fputcsv($fp, $row);
}
} elseif (isset($reader)) {
foreach ($reader as $row) {
fputcsv($fp, $row);
}
} else if (isset($parameter['data'])) {
foreach ($parameter['data'] as $row) {
fputcsv($fp, $row, ";");
}
}
return true;
}
throw new \yii\web\HttpException(500, "Not a valid parameter!");
}
}