1 | <?php |
||||
2 | |||||
3 | namespace Backend\Core\Engine; |
||||
4 | |||||
5 | use Backend\Core\Engine\Model as BackendModel; |
||||
6 | use Common\Exception\RedirectException; |
||||
7 | use PhpOffice\PhpSpreadsheet\Spreadsheet; |
||||
8 | use PhpOffice\PhpSpreadsheet\Writer\Csv as CsvWriter; |
||||
9 | use Symfony\Component\HttpFoundation\StreamedResponse; |
||||
10 | |||||
11 | /** |
||||
12 | * @deprecated remove this in Fork 6, just use ForkCMS\Utility\Csv\Writer |
||||
13 | */ |
||||
14 | class Csv extends \SpoonFileCSV |
||||
15 | { |
||||
16 | /** |
||||
17 | * Output a CSV-file as a download |
||||
18 | * |
||||
19 | * @deprecated remove this in Fork 6, just use ForkCMS\Utility\Csv\Writer->output() |
||||
20 | * |
||||
21 | * @param string $filename The name of the file. |
||||
22 | * @param array $array The array to convert. |
||||
23 | * @param array $columns The column names you want to use. |
||||
24 | * @param array $excludeColumns The columns you want to exclude. |
||||
25 | * |
||||
26 | * @throws RedirectException |
||||
27 | */ |
||||
28 | public static function outputCSV( |
||||
29 | string $filename, |
||||
30 | array $array, |
||||
31 | array $columns = null, |
||||
32 | array $excludeColumns = null |
||||
33 | ) { |
||||
34 | $headers = $columns; |
||||
35 | $data = $array; |
||||
36 | |||||
37 | // remove data that should be excluded |
||||
38 | if (!empty($excludeColumns)) { |
||||
39 | $headers = array_filter( |
||||
40 | $columns, |
||||
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||
41 | function ($column) use ($excludeColumns) { |
||||
42 | return !in_array($column, $excludeColumns); |
||||
43 | } |
||||
44 | ); |
||||
45 | |||||
46 | foreach ($array as $rowNumber => $row) { |
||||
47 | $data[$rowNumber] = array_filter( |
||||
48 | $row, |
||||
49 | function ($key) use ($excludeColumns) { |
||||
50 | return !in_array($key, $excludeColumns); |
||||
51 | }, |
||||
52 | ARRAY_FILTER_USE_KEY |
||||
53 | ); |
||||
54 | } |
||||
55 | } |
||||
56 | |||||
57 | $spreadSheet = new Spreadsheet(); |
||||
58 | $sheet = $spreadSheet->getActiveSheet(); |
||||
59 | |||||
60 | // add data |
||||
61 | $sheet->fromArray($headers, null, 'A1'); |
||||
0 ignored issues
–
show
It seems like
$headers can also be of type null ; however, parameter $source of PhpOffice\PhpSpreadsheet...\Worksheet::fromArray() does only seem to accept array , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
62 | $sheet->fromArray($data, null, 'A2'); |
||||
63 | |||||
64 | $writer = new CsvWriter($spreadSheet); |
||||
65 | $writer->setDelimiter(Authentication::getUser()->getSetting('csv_split_character')); |
||||
66 | $writer->setEnclosure('"'); |
||||
67 | $writer->setLineEnding(self::getLineEnding()); |
||||
68 | |||||
69 | $response = new StreamedResponse( |
||||
70 | function () use ($writer) { |
||||
71 | $writer->save('php://output'); |
||||
72 | } |
||||
73 | ); |
||||
74 | |||||
75 | // set headers |
||||
76 | $charset = BackendModel::getContainer()->getParameter('kernel.charset'); |
||||
77 | $response->headers->set('Content-type', 'application/csv; charset=' . $charset); |
||||
78 | $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); |
||||
79 | $response->headers->set('Cache-Control', 'max-age=0'); |
||||
80 | $response->headers->set('Pragma', 'no-cache'); |
||||
81 | |||||
82 | throw new RedirectException( |
||||
83 | 'Return the csv data', |
||||
84 | $response |
||||
85 | ); |
||||
86 | } |
||||
87 | |||||
88 | /** |
||||
89 | * @deprecated remove this in Fork 6, you should not rely on this. |
||||
90 | */ |
||||
91 | private static function getLineEnding(): string |
||||
92 | { |
||||
93 | $lineEnding = Authentication::getUser()->getSetting('csv_line_ending'); |
||||
94 | |||||
95 | // reformat |
||||
96 | if ($lineEnding === '\n') { |
||||
97 | return "\n"; |
||||
98 | } |
||||
99 | if ($lineEnding === '\r\n') { |
||||
100 | return "\r\n"; |
||||
101 | } |
||||
102 | |||||
103 | return $lineEnding; |
||||
104 | } |
||||
105 | } |
||||
106 |