Issues (281)

Branch: master

src/Backend/Core/Engine/Csv.php (2 issues)

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
It seems like $columns can also be of type null; however, parameter $array of array_filter() 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 ignore-type  annotation

40
                /** @scrutinizer ignore-type */ $columns,
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 ignore-type  annotation

61
        $sheet->fromArray(/** @scrutinizer ignore-type */ $headers, null, 'A1');
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