Completed
Push — master ( 71bb3f...8f261b )
by Christian
03:14
created

ImporterFromExcel   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 15
lcom 1
cbo 3
dl 0
loc 86
ccs 33
cts 33
cp 1
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A import() 0 7 1
A getSheets() 0 19 6
A importSheets() 0 12 2
B parseTranslations() 0 22 6
1
<?php
2
3
namespace Omatech\Mage\Core\Adapters\Translations\Importers;
4
5
use Box\Spout\Common\Type;
6
use Box\Spout\Reader\ReaderFactory;
7
use Omatech\Mage\Core\Domains\Translations\Contracts\ImportTranslationInterface;
8
use Rap2hpoutre\FastExcel\FastExcel;
9
10
class ImporterFromExcel implements ImportTranslationInterface
11
{
12
    /**
13
     * @param string $path
14
     * @param string $locale
15
     * @return array
16
     */
17 3
    public function import(string $path, string $locale = ''): array
18
    {
19 3
        $sheetNames = $this->getSheets($path, $locale);
20 3
        $sheets = $this->importSheets($path, $sheetNames);
21
22 3
        return $this->parseTranslations($sheetNames, $sheets);
23
    }
24
25
    /**
26
     * @param string $path
27
     * @param string $locale
28
     * @return array
29
     */
30 3
    private function getSheets(string $path, string $locale = ''): array
31
    {
32 3
        $sheetNames = [];
33
34 3
        $reader = ReaderFactory::create(Type::XLSX);
35 3
        $reader->open($path);
36
37 3
        foreach ($reader->getSheetIterator() as $sheet) {
38 3
            array_push($sheetNames, $sheet->getName());
39
        }
40
41 3
        if ('' != $locale && in_array($locale, $sheetNames)) {
42 1
            $sheetNames = [0 => $locale];
43 2
        } elseif ('' != $locale && !in_array($locale, $sheetNames)) {
44 1
            $sheetNames = [];
45
        }
46
47 3
        return $sheetNames;
48
    }
49
50
    /**
51
     * @param string $path
52
     * @param array $sheetNames
53
     * @return array
54
     */
55 3
    private function importSheets(string $path, array $sheetNames): array
56
    {
57 3
        $sheets = (new FastExcel());
58
59 3
        if (count($sheetNames) > 1) {
60 1
            $sheets = $sheets->importSheets($path)->toArray();
61
        } else {
62 2
            $sheets = [$sheets->sheet(key($sheetNames) + 1)->import($path)->toArray()];
63
        }
64
65 3
        return $sheets;
66
    }
67
68
    /**
69
     * @param array $sheetNames
70
     * @param array $sheets
71
     * @return array
72
     */
73 3
    private function parseTranslations(array $sheetNames, array $sheets): array
74
    {
75 3
        $translations = [];
76 3
        $parsedKeys = [];
77
78 3
        if ($sheetNames) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $sheetNames of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
79 2
            foreach ($sheets as $lang => $trans) {
80 2
                $translations[$sheetNames[$lang]] = $trans;
81
            }
82
83 2
            foreach ($translations as $lang => $keys) {
84 2
                foreach ($keys as $key) {
85 2
                    if ('' != $key['key2']) {
86 2
                        $parsedKeys[$key['key2']]['key'] = $key['key2'];
87 2
                        $parsedKeys[$key['key2']]['value'][$lang] = $key['value'];
88
                    }
89
                }
90
            }
91
        }
92
93 3
        return array_values($parsedKeys);
94
    }
95
}
96