Completed
Pull Request — master (#264)
by Marie
11:11
created

Writer::addBomToFile()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
ccs 0
cts 0
cp 0
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
crap 2
1
<?php
2
3
namespace Box\Spout\Writer\CSV;
4
5
use Box\Spout\Writer\AbstractWriter;
6
use Box\Spout\Common\Exception\IOException;
7
use Box\Spout\Common\Helper\EncodingHelper;
8
9
/**
10
 * Class Writer
11
 * This class provides support to write data to CSV files
12
 *
13
 * @package Box\Spout\Writer\CSV
14
 */
15
class Writer extends AbstractWriter
16
{
17
    /** Number of rows to write before flushing */
18
    const FLUSH_THRESHOLD = 500;
19
20
    /** @var string Content-Type value for the header */
21
    protected static $headerContentType = 'text/csv; charset=UTF-8';
22
23
    /** @var string Defines the character used to delimit fields (one character only) */
24
    protected $fieldDelimiter = ',';
25
26
    /** @var string Defines the character used to enclose fields (one character only) */
27
    protected $fieldEnclosure = '"';
28
29
    /** @var int */
30
    protected $lastWrittenRowIndex = 0;
31
32
    /** @var bool */
33
    protected $addBomToFile = true;
34
35
    /**
36
     * Sets the field delimiter for the CSV
37
     *
38
     * @api
39 18
     * @param string $fieldDelimiter Character that delimits fields
40
     * @return Writer
41 18
     */
42 18
    public function setFieldDelimiter($fieldDelimiter)
43
    {
44
        $this->fieldDelimiter = $fieldDelimiter;
45
        return $this;
46
    }
47
48
    /**
49
     * Sets the field enclosure for the CSV
50
     *
51
     * @api
52 18
     * @param string $fieldEnclosure Character that enclose fields
53
     * @return Writer
54 18
     */
55 18
    public function setFieldEnclosure($fieldEnclosure)
56
    {
57
        $this->fieldEnclosure = $fieldEnclosure;
58
        return $this;
59
    }
60
61
    /**
62
     * Set if a BOM has to be added to the file
63 18
     *
64
     * @param bool $addBomToFile
65
     *
66 18
     * @return Writer
67 18
     */
68
    public function addBomToFile($addBomToFile)
69
    {
70
        $this->addBomToFile = (bool) $addBomToFile;
71
        return $this;
72
    }
73
74
    /**
75
     * Opens the CSV streamer and makes it ready to accept data.
76
     *
77
     * @return void
78 18
     */
79
    protected function openWriter()
80 18
    {
81 18
        if ($this->addBomToFile) {
82
            // Adds UTF-8 BOM for Unicode compatibility
83
            $this->globalFunctionsHelper->fputs($this->filePointer, EncodingHelper::BOM_UTF8);
84
        }
85 18
    }
86 18
87
    /**
88
     * Adds data to the currently opened writer.
89 18
     *
90
     * @param  array $dataRow Array containing data to be written.
91
     *          Example $dataRow = ['data1', 1234, null, '', 'data5'];
92
     * @param \Box\Spout\Writer\Style\Style $style Ignored here since CSV does not support styling.
93
     * @return void
94
     * @throws \Box\Spout\Common\Exception\IOException If unable to write data
95
     */
96
    protected function addRowToWriter(array $dataRow, $style)
97 18
    {
98
        $wasWriteSuccessful = $this->globalFunctionsHelper->fputcsv($this->filePointer, $dataRow, $this->fieldDelimiter, $this->fieldEnclosure);
99 18
        if ($wasWriteSuccessful === false) {
100 18
            throw new IOException('Unable to write data');
101
        }
102
103
        $this->lastWrittenRowIndex++;
104
        if ($this->lastWrittenRowIndex % self::FLUSH_THRESHOLD === 0) {
105
            $this->globalFunctionsHelper->fflush($this->filePointer);
106
        }
107
    }
108
109
    /**
110
     * Closes the CSV streamer, preventing any additional writing.
111
     * If set, sets the headers and redirects output to the browser.
112
     *
113
     * @return void
114
     */
115
    protected function closeWriter()
116
    {
117
        $this->lastWrittenRowIndex = 0;
118
    }
119
}
120