Completed
Push — master ( 8b1d35...5ae2aa )
by Mike
02:25
created

AbstractDataProvider::setFieldFromArrayData()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5.025

Importance

Changes 0
Metric Value
cc 5
eloc 10
nc 5
nop 3
dl 0
loc 16
ccs 9
cts 10
cp 0.9
crap 5.025
rs 9.6111
c 0
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
4
5
namespace Xervice\DataProvider\Business\Model\DataProvider;
6
7
/**
8
 * @method array getElements()
9
 */
10
abstract class AbstractDataProvider implements DataProviderInterface
11
{
12
    /**
13
     * @return array
14
     */
15 2
    public function toArray(): array
16
    {
17 2
        return $this->convertToArray($this);
18
    }
19
20
    /**
21
     * @param array $data
22
     */
23 2
    public function fromArray(array $data): void
24
    {
25 2
        foreach ($this->getElements() as $element) {
26 2
            $fieldname = $element['name'];
27 2
            if (isset($data[$fieldname])) {
28 2
                $this->setFieldFromArrayData($data, $element, $fieldname);
29
            }
30
        }
31 2
    }
32
33
    /**
34
     * @param \Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface $provider
35
     *
36
     * @return array
37
     */
38 2
    private function convertToArray(DataProviderInterface $provider): array
39
    {
40 2
        $data = [];
41 2
        foreach ($provider->getElements() as $element) {
0 ignored issues
show
Bug introduced by
The method getElements() does not exist on Xervice\DataProvider\Bus...r\DataProviderInterface. It seems like you code against a sub-type of said class. However, the method does not exist in Xervice\DataProvider\Bus...rovider\AnyDataProvider. Are you sure you never get one of those? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

41
        foreach ($provider->/** @scrutinizer ignore-call */ getElements() as $element) {
Loading history...
42 2
            $fieldname = $element['name'];
43 2
            $hasMethod = 'has' . $fieldname;
44 2
            if ($provider->$hasMethod()) {
45 2
                $data = $this->getDataFromFields($provider, $fieldname, $element, $data);
46
            }
47
        }
48
49 2
        return $data;
50
    }
51
52
    /**
53
     * @param array $data
54
     * @param array $element
55
     * @param string $fieldname
56
     */
57 2
    private function setFieldFromArrayData(array $data, array $element, string $fieldname): void
58
    {
59 2
        if (strpos($element['type'], 'DataProviderInterface[]') !== false) {
60 1
            $this->setChildData($data, $fieldname);
61
        }
62 2
        elseif (strpos($element['type'], 'DataProviderInterface') !== false) {
63 1
            $this->setAnyDataProviderValues($data, $fieldname);
64
        }
65 2
        elseif ($element['is_dataprovider']) {
66
            $this->setOneDataProviderValue($data, $element, $fieldname);
67
        }
68 2
        elseif ($element['is_collection']) {
69 1
            $this->setCollectionValues($data, $element, $fieldname);
70
        }
71
        else {
72 2
            $this->{$fieldname} = $data[$fieldname];
73
        }
74 2
    }
75
76
    /**
77
     * @param \Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface $provider
78
     * @param string $fieldname
79
     * @param array $element
80
     * @param array $data
81
     *
82
     * @return mixed
83
     */
84 2
    private function getDataFromFields(DataProviderInterface $provider, string $fieldname, array $element, array $data)
85
    {
86 2
        $getMethod = 'get' . $fieldname;
87 2
        if (strpos($element['type'], 'DataProviderInterface[]') !== false) {
88 1
            $data = $this->getDataProviderCollectionData($provider, $fieldname, $data, $getMethod);
89
        }
90
        elseif (
91 2
            strpos($element['type'], 'DataProviderInterface') !== false
92 2
            && $provider->{$getMethod}() instanceof DataProviderInterface
93
        ) {
94 1
            $anyDataProvider = new AnyDataProvider($provider->{$getMethod}());
95 1
            $data[$fieldname] = $anyDataProvider->toArray();
96
        }
97 2
        elseif ($element['is_dataprovider'] && $provider->{$getMethod}() instanceof DataProviderInterface) {
98
            $data[$fieldname] = $this->convertToArray($provider->{$getMethod}());
99
        }
100 2
        elseif ($element['is_collection']) {
101 1
            $data = $this->getCollectionData($provider, $fieldname, $data, $getMethod);
102
        }
103
        else {
104 2
            $data[$fieldname] = $provider->{$getMethod}();
105
        }
106 2
        return $data;
107
    }
108
109
    /**
110
     * @param array $data
111
     * @param string $fieldname
112
     */
113 1
    private function setChildData(array $data, string $fieldname): void
114
    {
115 1
        foreach ($data[$fieldname] as $childData) {
116 1
            $anyDataProvider = new AnyDataProvider();
117 1
            $anyDataProvider->fromArray($childData);
118 1
            $this->{$fieldname}[] = $anyDataProvider->getDataProvider();
119
        }
120 1
    }
121
122
    /**
123
     * @param array $data
124
     * @param string $fieldname
125
     */
126 1
    private function setAnyDataProviderValues(array $data, string $fieldname): void
127
    {
128 1
        $anyDataProvider = new AnyDataProvider();
129 1
        $anyDataProvider->fromArray($data[$fieldname]);
130 1
        $this->{$fieldname} = $anyDataProvider->getDataProvider();
131 1
    }
132
133
    /**
134
     * @param array $data
135
     * @param array $element
136
     * @param string $fieldname
137
     */
138
    private function setOneDataProviderValue(array $data, array $element, string $fieldname): void
139
    {
140
        $dataProvider = new $element['type']();
141
        if (\is_array($data[$fieldname])) {
142
            $dataProvider->fromArray($data[$fieldname]);
143
        }
144
        $this->{$fieldname} = $dataProvider;
145
    }
146
147
    /**
148
     * @param array $data
149
     * @param array $element
150
     * @param string $fieldname
151
     */
152 1
    private function setCollectionValues(array $data, array $element, string $fieldname): void
153
    {
154 1
        foreach ($data[$fieldname] as $childData) {
155 1
            $dataProvider = new $element['singleton_type']();
156 1
            $dataProvider->fromArray($childData);
157 1
            $this->{$fieldname}[] = $dataProvider;
158
        }
159 1
    }
160
161
    /**
162
     * @param \Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface $provider
163
     * @param string $fieldname
164
     * @param array $data
165
     * @param string $getMethod
166
     *
167
     * @return array
168
     */
169 1
    private function getDataProviderCollectionData(
170
        DataProviderInterface $provider,
171
        string $fieldname,
172
        array $data,
173
        string $getMethod
174
    ): array {
175 1
        $data[$fieldname] = [];
176 1
        foreach ($provider->{$getMethod}() as $child) {
177 1
            $anyDataProvider = new AnyDataProvider($child);
178 1
            $data[$fieldname][] = $anyDataProvider->toArray();
179
        }
180 1
        return $data;
181
    }
182
183
    /**
184
     * @param \Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface $provider
185
     * @param string $fieldname
186
     * @param array $data
187
     * @param string $getMethod
188
     *
189
     * @return array
190
     */
191 1
    private function getCollectionData(
192
        DataProviderInterface $provider,
193
        string $fieldname,
194
        array $data,
195
        string $getMethod
196
    ): array {
197 1
        $data[$fieldname] = [];
198 1
        foreach ($provider->{$getMethod}() as $child) {
199 1
            $data[$fieldname][] = $child->toArray();
200
        }
201 1
        return $data;
202
    }
203
}