Completed
Push — develop ( 5dd185...41a1aa )
by Adrien
21:47 queued 14:23
created

Rels::writeWorksheetRelationships()   C

Complexity

Conditions 9
Paths 96

Size

Total Lines 83
Code Lines 52

Duplication

Lines 5
Ratio 6.02 %

Code Coverage

Tests 44
CRAP Score 9.0008

Importance

Changes 0
Metric Value
cc 9
eloc 52
nc 96
nop 3
dl 5
loc 83
ccs 44
cts 45
cp 0.9778
crap 9.0008
rs 5.48
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
4
5
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
6
use PhpOffice\PhpSpreadsheet\Spreadsheet;
7
use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
8
use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
9
10
/**
11
 * Copyright (c) 2006 - 2016 PhpSpreadsheet.
12
 *
13
 * This library is free software; you can redistribute it and/or
14
 * modify it under the terms of the GNU Lesser General Public
15
 * License as published by the Free Software Foundation; either
16
 * version 2.1 of the License, or (at your option) any later version.
17
 *
18
 * This library is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
 * Lesser General Public License for more details.
22
 *
23
 * You should have received a copy of the GNU Lesser General Public
24
 * License along with this library; if not, write to the Free Software
25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26
 *
27
 * @category   PhpSpreadsheet
28
 *
29
 * @copyright  Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
30
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
31
 */
32
class Rels extends WriterPart
33
{
34
    /**
35
     * Write relationships to XML format.
36
     *
37
     * @param Spreadsheet $spreadsheet
38
     *
39
     * @throws WriterException
40
     *
41
     * @return string XML Output
42
     */
43 56
    public function writeRelationships(Spreadsheet $spreadsheet)
44
    {
45
        // Create XML writer
46 56
        $objWriter = null;
0 ignored issues
show
Unused Code introduced by
$objWriter is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
47 56 View Code Duplication
        if ($this->getParentWriter()->getUseDiskCaching()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
48
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
49
        } else {
50 56
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
51
        }
52
53
        // XML header
54 56
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
55
56
        // Relationships
57 56
        $objWriter->startElement('Relationships');
58 56
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
59
60 56
        $customPropertyList = $spreadsheet->getProperties()->getCustomProperties();
61 56
        if (!empty($customPropertyList)) {
62
            // Relationship docProps/app.xml
63 2
            $this->writeRelationship(
64
                $objWriter,
65 2
                4,
66 2
                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties',
67 2
                'docProps/custom.xml'
68
            );
69
        }
70
71
        // Relationship docProps/app.xml
72 56
        $this->writeRelationship(
73
            $objWriter,
74 56
            3,
75 56
            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',
76 56
            'docProps/app.xml'
77
        );
78
79
        // Relationship docProps/core.xml
80 56
        $this->writeRelationship(
81
            $objWriter,
82 56
            2,
83 56
            'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',
84 56
            'docProps/core.xml'
85
        );
86
87
        // Relationship xl/workbook.xml
88 56
        $this->writeRelationship(
89
            $objWriter,
90 56
            1,
91 56
            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',
92 56
            'xl/workbook.xml'
93
        );
94
        // a custom UI in workbook ?
95 56
        if ($spreadsheet->hasRibbon()) {
96
            $this->writeRelationShip(
97
                $objWriter,
98
                5,
99
                'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility',
100
                $spreadsheet->getRibbonXMLData('target')
101
            );
102
        }
103
104 56
        $objWriter->endElement();
105
106 56
        return $objWriter->getData();
107
    }
108
109
    /**
110
     * Write workbook relationships to XML format.
111
     *
112
     * @param Spreadsheet $spreadsheet
113
     *
114
     * @throws WriterException
115
     *
116
     * @return string XML Output
117
     */
118 56
    public function writeWorkbookRelationships(Spreadsheet $spreadsheet)
119
    {
120
        // Create XML writer
121 56
        $objWriter = null;
0 ignored issues
show
Unused Code introduced by
$objWriter is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
122 56 View Code Duplication
        if ($this->getParentWriter()->getUseDiskCaching()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
123
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
124
        } else {
125 56
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
126
        }
127
128
        // XML header
129 56
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
130
131
        // Relationships
132 56
        $objWriter->startElement('Relationships');
133 56
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
134
135
        // Relationship styles.xml
136 56
        $this->writeRelationship(
137
            $objWriter,
138 56
            1,
139 56
            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',
140 56
            'styles.xml'
141
        );
142
143
        // Relationship theme/theme1.xml
144 56
        $this->writeRelationship(
145
            $objWriter,
146 56
            2,
147 56
            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
148 56
            'theme/theme1.xml'
149
        );
150
151
        // Relationship sharedStrings.xml
152 56
        $this->writeRelationship(
153
            $objWriter,
154 56
            3,
155 56
            'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',
156 56
            'sharedStrings.xml'
157
        );
158
159
        // Relationships with sheets
160 56
        $sheetCount = $spreadsheet->getSheetCount();
161 56
        for ($i = 0; $i < $sheetCount; ++$i) {
162 56
            $this->writeRelationship(
163
                $objWriter,
164 56
                ($i + 1 + 3),
165 56
                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',
166 56
                'worksheets/sheet' . ($i + 1) . '.xml'
167
            );
168
        }
169
        // Relationships for vbaProject if needed
170
        // id : just after the last sheet
171 56
        if ($spreadsheet->hasMacros()) {
172
            $this->writeRelationShip(
173
                $objWriter,
174
                ($i + 1 + 3),
175
                'http://schemas.microsoft.com/office/2006/relationships/vbaProject',
176
                'vbaProject.bin'
177
            );
178
            ++$i; //increment i if needed for an another relation
179
        }
180
181 56
        $objWriter->endElement();
182
183 56
        return $objWriter->getData();
184
    }
185
186
    /**
187
     * Write worksheet relationships to XML format.
188
     *
189
     * Numbering is as follows:
190
     *     rId1                 - Drawings
191
     *  rId_hyperlink_x     - Hyperlinks
192
     *
193
     * @param \PhpOffice\PhpSpreadsheet\Worksheet $pWorksheet
194
     * @param int $pWorksheetId
195
     * @param bool $includeCharts Flag indicating if we should write charts
196
     *
197
     * @throws WriterException
198
     *
199
     * @return string XML Output
200
     */
201 56
    public function writeWorksheetRelationships(\PhpOffice\PhpSpreadsheet\Worksheet $pWorksheet, $pWorksheetId = 1, $includeCharts = false)
202
    {
203
        // Create XML writer
204 56
        $objWriter = null;
0 ignored issues
show
Unused Code introduced by
$objWriter is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
205 56 View Code Duplication
        if ($this->getParentWriter()->getUseDiskCaching()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
206
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
207
        } else {
208 56
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
209
        }
210
211
        // XML header
212 56
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
213
214
        // Relationships
215 56
        $objWriter->startElement('Relationships');
216 56
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
217
218
        // Write drawing relationships?
219 56
        $d = 0;
220 56
        if ($includeCharts) {
221 14
            $charts = $pWorksheet->getChartCollection();
222
        } else {
223 43
            $charts = [];
224
        }
225 56
        if (($pWorksheet->getDrawingCollection()->count() > 0) ||
0 ignored issues
show
Bug introduced by
The method count cannot be called on $pWorksheet->getDrawingCollection() (of type array<integer,object<Php...Worksheet\BaseDrawing>>).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
226 56
            (count($charts) > 0)) {
227 22
            $this->writeRelationship(
228
                $objWriter,
229 22
                ++$d,
230 22
                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
231 22
                '../drawings/drawing' . $pWorksheetId . '.xml'
232
            );
233
        }
234
235
        // Write hyperlink relationships?
236 56
        $i = 1;
237 56
        foreach ($pWorksheet->getHyperlinkCollection() as $hyperlink) {
238 9
            if (!$hyperlink->isInternal()) {
239 9
                $this->writeRelationship(
240
                    $objWriter,
241 9
                    '_hyperlink_' . $i,
242 9
                    'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
243 9
                    $hyperlink->getUrl(),
244 9
                    'External'
245
                );
246
247 9
                ++$i;
248
            }
249
        }
250
251
        // Write comments relationship?
252 56
        $i = 1;
253 56
        if (count($pWorksheet->getComments()) > 0) {
254 9
            $this->writeRelationship(
255
                $objWriter,
256 9
                '_comments_vml' . $i,
257 9
                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',
258 9
                '../drawings/vmlDrawing' . $pWorksheetId . '.vml'
259
            );
260
261 9
            $this->writeRelationship(
262
                $objWriter,
263 9
                '_comments' . $i,
264 9
                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',
265 9
                '../comments' . $pWorksheetId . '.xml'
266
            );
267
        }
268
269
        // Write header/footer relationship?
270 56
        $i = 1;
271 56
        if (count($pWorksheet->getHeaderFooter()->getImages()) > 0) {
272 1
            $this->writeRelationship(
273
                $objWriter,
274 1
                '_headerfooter_vml' . $i,
275 1
                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',
276 1
                '../drawings/vmlDrawingHF' . $pWorksheetId . '.vml'
277
            );
278
        }
279
280 56
        $objWriter->endElement();
281
282 56
        return $objWriter->getData();
283
    }
284
285
    /**
286
     * Write drawing relationships to XML format.
287
     *
288
     * @param \PhpOffice\PhpSpreadsheet\Worksheet $pWorksheet
289
     * @param int &$chartRef Chart ID
290
     * @param bool $includeCharts Flag indicating if we should write charts
291
     *
292
     * @throws WriterException
293
     *
294
     * @return string XML Output
295
     */
296 22
    public function writeDrawingRelationships(\PhpOffice\PhpSpreadsheet\Worksheet $pWorksheet, &$chartRef, $includeCharts = false)
297
    {
298
        // Create XML writer
299 22
        $objWriter = null;
0 ignored issues
show
Unused Code introduced by
$objWriter is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
300 22 View Code Duplication
        if ($this->getParentWriter()->getUseDiskCaching()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
301
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
302
        } else {
303 22
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
304
        }
305
306
        // XML header
307 22
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
308
309
        // Relationships
310 22
        $objWriter->startElement('Relationships');
311 22
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
312
313
        // Loop through images and write relationships
314 22
        $i = 1;
315 22
        $iterator = $pWorksheet->getDrawingCollection()->getIterator();
0 ignored issues
show
Bug introduced by
The method getIterator cannot be called on $pWorksheet->getDrawingCollection() (of type array<integer,object<Php...Worksheet\BaseDrawing>>).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
316 22
        while ($iterator->valid()) {
317 10
            if ($iterator->current() instanceof \PhpOffice\PhpSpreadsheet\Worksheet\Drawing
318 10
                || $iterator->current() instanceof MemoryDrawing) {
319
                // Write relationship for image drawing
320 10
                $this->writeRelationship(
321
                    $objWriter,
322
                    $i,
323 10
                    'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
324 10
                    '../media/' . str_replace(' ', '', $iterator->current()->getIndexedFilename())
325
                );
326
            }
327
328 10
            $iterator->next();
329 10
            ++$i;
330
        }
331
332 22
        if ($includeCharts) {
333
            // Loop through charts and write relationships
334 13
            $chartCount = $pWorksheet->getChartCount();
335 13
            if ($chartCount > 0) {
336 13
                for ($c = 0; $c < $chartCount; ++$c) {
337 13
                    $this->writeRelationship(
338
                        $objWriter,
339 13
                        $i++,
340 13
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
341 13
                        '../charts/chart' . ++$chartRef . '.xml'
342
                    );
343
                }
344
            }
345
        }
346
347 22
        $objWriter->endElement();
348
349 22
        return $objWriter->getData();
350
    }
351
352
    /**
353
     * Write header/footer drawing relationships to XML format.
354
     *
355
     * @param \PhpOffice\PhpSpreadsheet\Worksheet $pWorksheet
356
     *
357
     * @throws WriterException
358
     *
359
     * @return string XML Output
360
     */
361 1
    public function writeHeaderFooterDrawingRelationships(\PhpOffice\PhpSpreadsheet\Worksheet $pWorksheet)
362
    {
363
        // Create XML writer
364 1
        $objWriter = null;
0 ignored issues
show
Unused Code introduced by
$objWriter is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
365 1 View Code Duplication
        if ($this->getParentWriter()->getUseDiskCaching()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
366
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
367
        } else {
368 1
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
369
        }
370
371
        // XML header
372 1
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
373
374
        // Relationships
375 1
        $objWriter->startElement('Relationships');
376 1
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
377
378
        // Loop through images and write relationships
379 1
        foreach ($pWorksheet->getHeaderFooter()->getImages() as $key => $value) {
380
            // Write relationship for image drawing
381 1
            $this->writeRelationship(
382
                $objWriter,
383
                $key,
384 1
                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
385 1
                '../media/' . $value->getIndexedFilename()
386
            );
387
        }
388
389 1
        $objWriter->endElement();
390
391 1
        return $objWriter->getData();
392
    }
393
394
    /**
395
     * Write Override content type.
396
     *
397
     * @param XMLWriter $objWriter XML Writer
398
     * @param int $pId Relationship ID. rId will be prepended!
399
     * @param string $pType Relationship type
400
     * @param string $pTarget Relationship target
401
     * @param string $pTargetMode Relationship target mode
402
     *
403
     * @throws WriterException
404
     */
405 56 View Code Duplication
    private function writeRelationship(XMLWriter $objWriter, $pId, $pType, $pTarget, $pTargetMode = '')
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
406
    {
407 56
        if ($pType != '' && $pTarget != '') {
408
            // Write relationship
409 56
            $objWriter->startElement('Relationship');
410 56
            $objWriter->writeAttribute('Id', 'rId' . $pId);
411 56
            $objWriter->writeAttribute('Type', $pType);
412 56
            $objWriter->writeAttribute('Target', $pTarget);
413
414 56
            if ($pTargetMode != '') {
415 9
                $objWriter->writeAttribute('TargetMode', $pTargetMode);
416
            }
417
418 56
            $objWriter->endElement();
419
        } else {
420
            throw new WriterException('Invalid parameters passed.');
421
        }
422 56
    }
423
}
424