Completed
Push — master ( f8a734...ab512b )
by Tim
12s
created

AbstractProductImportObserver::getRow()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
c 0
b 0
f 0
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
/**
4
 * TechDivision\Import\Product\Observers\AbstractProductImportObserver
5
 *
6
 * NOTICE OF LICENSE
7
 *
8
 * This source file is subject to the Open Software License (OSL 3.0)
9
 * that is available through the world-wide-web at this URL:
10
 * http://opensource.org/licenses/osl-3.0.php
11
 *
12
 * PHP version 5
13
 *
14
 * @author    Tim Wagner <[email protected]>
15
 * @copyright 2016 TechDivision GmbH <[email protected]>
16
 * @license   http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
17
 * @link      https://github.com/techdivision/import-product
18
 * @link      http://www.techdivision.com
19
 */
20
21
namespace TechDivision\Import\Product\Observers;
22
23
use TechDivision\Import\Utils\EntityStatus;
24
use TechDivision\Import\Product\Utils\ColumnKeys;
25
use TechDivision\Import\Observers\AbstractObserver;
26
27
/**
28
 * A SLSB that handles the process to import product bunches.
29
 *
30
 * @author    Tim Wagner <[email protected]>
31
 * @copyright 2016 TechDivision GmbH <[email protected]>
32
 * @license   http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
33
 * @link      https://github.com/techdivision/import-product
34
 * @link      http://www.techdivision.com
35
 */
36
abstract class AbstractProductImportObserver extends AbstractObserver implements ProductImportObserverInterface
37
{
38
39
    /**
40
     * The actual row, that has to be processed.
41
     *
42
     * @var array
43
     */
44
    protected $row = array();
45
46
    /**
47
     * Set's the actual row, that has to be processed.
48
     *
49
     * @param array $row The row
50
     *
51
     * @return void
52
     */
53 7
    public function setRow(array $row)
54
    {
55 7
        $this->row = $row;
56 7
    }
57
58
    /**
59
     * Return's the actual row, that has to be processed.
60
     *
61
     * @return array The row
62
     */
63 7
    public function getRow()
64
    {
65 7
        return $this->row;
66
    }
67
68
    /**
69
     * Will be invoked by the action on the events the listener has been registered for.
70
     *
71
     * @param array $row The row to handle
72
     *
73
     * @return array The modified row
74
     * @see \TechDivision\Import\Product\Observers\ImportObserverInterface::handle()
75
     */
76 7
    public function handle(array $row)
77
    {
78
79
        // initialize the row
80 7
        $this->setRow($row);
81
82
        // process the functionality and return the row
83 7
        $this->process();
84
85
        // return the processed row
86 7
        return $this->getRow();
87
    }
88
89
    /**
90
     * Process the observer's business logic.
91
     *
92
     * @return array The processed row
93
     */
94
    protected function process()
95
    {
96
97
    }
98
99
    /**
100
     * Set's the array containing header row.
101
     *
102
     * @param array $headers The array with the header row
103
     *
104
     * @return void
105
     */
106
    public function setHeaders(array $headers)
107
    {
108
        $this->getSubject()->setHeaders($headers);
109
    }
110
111
    /**
112
     * Return's the array containing header row.
113
     *
114
     * @return array The array with the header row
115
     */
116
    protected function getHeaders()
117
    {
118
        return $this->getSubject()->getHeaders();
119
    }
120
121
    /**
122
     * Queries whether or not the header with the passed name is available.
123
     *
124
     * @param string $name The header name to query
125
     *
126
     * @return boolean TRUE if the header is available, else FALSE
127
     */
128 7
    protected function hasHeader($name)
129
    {
130 7
        return $this->getSubject()->hasHeader($name);
131
    }
132
133
    /**
134
     * Return's the header value for the passed name.
135
     *
136
     * @param string $name The name of the header to return the value for
137
     *
138
     * @return mixed The header value
139
     * \InvalidArgumentException Is thrown, if the header with the passed name is NOT available
140
     */
141 7
    protected function getHeader($name)
142
    {
143 7
        return $this->getSubject()->getHeader($name);
144
    }
145
146
    /**
147
     * Add's the header with the passed name and position, if not NULL.
148
     *
149
     * @param string $name The header name to add
150
     *
151
     * @return integer The new headers position
152
     */
153
    protected function addHeader($name)
154
    {
155
        return $this->getSubject()->addHeader($name);
156
    }
157
158
    /**
159
     * Return's TRUE if the passed SKU is the actual one.
160
     *
161
     * @param string $sku The SKU to check
162
     *
163
     * @return boolean TRUE if the passed SKU is the actual one
164
     */
165 7
    protected function isLastSku($sku)
166
    {
167 7
        return $this->getSubject()->getLastSku() === $sku;
168
    }
169
170
    /**
171
     * Return's the ID of the product that has been created recently.
172
     *
173
     * @return string The entity Id
174
     */
175 3
    protected function getLastEntityId()
176
    {
177 3
        return $this->getSubject()->getLastEntityId();
178
    }
179
180
    /**
181
     * Return's the source date format to use.
182
     *
183
     * @return string The source date format
184
     */
185 1
    protected function getSourceDateFormat()
186
    {
187 1
        return $this->getSubject()->getSourceDateFormat();
188
    }
189
190
    /**
191
     * Cast's the passed value based on the backend type information.
192
     *
193
     * @param string $backendType The backend type to cast to
194
     * @param mixed  $value       The value to be casted
195
     *
196
     * @return mixed The casted value
197
     */
198
    protected function castValueByBackendType($backendType, $value)
199
    {
200
        return $this->getSubject()->castValueByBackendType($backendType, $value);
201
    }
202
203
    /**
204
     * Set's the store view code the create the product/attributes for.
205
     *
206
     * @param string $storeViewCode The store view code
207
     *
208
     * @return void
209
     */
210 3
    protected function setStoreViewCode($storeViewCode)
211
    {
212 3
        $this->getSubject()->setStoreViewCode($storeViewCode);
213 3
    }
214
215
    /**
216
     * Return's the store view code the create the product/attributes for.
217
     *
218
     * @param string|null $default The default value to return, if the store view code has not been set
219
     *
220
     * @return string The store view code
221
     */
222
    protected function getStoreViewCode($default = null)
223
    {
224
        return $this->getSubject()->getStoreViewCode($default);
225
    }
226
227
    /**
228
     * Prepare's the store view code in the subject.
229
     *
230
     * @return void
231
     */
232 3
    protected function prepareStoreViewCode()
233
    {
234
235
        // re-set the store view code
236 3
        $this->setStoreViewCode(null);
237
238
        // initialize the store view code
239 3
        if ($storeViewCode = $this->getValue(ColumnKeys::STORE_VIEW_CODE)) {
240 2
            $this->setStoreViewCode($storeViewCode);
241
        }
242 3
    }
243
244
    /**
245
     * Tries to format the passed value to a valid date with format 'Y-m-d H:i:s'.
246
     * If the passed value is NOT a valid date, NULL will be returned.
247
     *
248
     * @param string|null $value The value to format
249
     *
250
     * @return string The formatted date
251
     */
252 1
    protected function formatDate($value)
253
    {
254
255
        // create a DateTime instance from the passed value
256 1
        if ($dateTime = \DateTime::createFromFormat($this->getSourceDateFormat(), $value)) {
257 1
            return $dateTime->format('Y-m-d H:i:s');
258
        }
259
260
        // return NULL, if the passed value is NOT a valid date
261
        return null;
262
    }
263
264
    /**
265
     * Extracts the elements of the passed value by exploding them
266
     * with the also passed separator.
267
     *
268
     * @param string $value     The value to extract
269
     * @param string $separator The separator used to extrace the elements
270
     *
271
     * @return array The exploded values
272
     */
273
    protected function explode($value, $separator = ',')
274
    {
275
        return explode($separator, $value);
276
    }
277
278
    /**
279
     * Query whether or not a value for the column with the passed name exists.
280
     *
281
     * @param string $name The column name to query for a valid value
282
     *
283
     * @return boolean TRUE if the value is set, else FALSE
284
     */
285 7
    protected function hasValue($name)
286
    {
287
288
        // query whether or not the header is available
289 7
        if (!$this->hasHeader($name)) {
290 1
            return false;
291
        }
292
293
        // load the key for the row
294 7
        $headerValue = $this->getHeader($name);
295
296
        // query whether the rows column has a vaild value
297 7
        return (isset($this->row[$headerValue]) && $this->row[$headerValue] != '');
298
    }
299
300
    /**
301
     * Set the value in the passed column name.
302
     *
303
     * @param string $name  The column name to set the value for
304
     * @param mixed  $value The value to set
305
     *
306
     * @return void
307
     */
308
    protected function setValue($name, $value)
309
    {
310
        $this->row[$this->getHeader($name)] = $value;
311
    }
312
313
    /**
314
     * Resolve's the value with the passed colum name from the actual row. If a callback will
315
     * be passed, the callback will be invoked with the found value as parameter. If
316
     * the value is NULL or empty, the default value will be returned.
317
     *
318
     * @param string        $name     The name of the column to return the value for
319
     * @param mixed|null    $default  The default value, that has to be returned, if the row's value is empty
320
     * @param callable|null $callback The callback that has to be invoked on the value, e. g. to format it
321
     *
322
     * @return mixed|null The, almost formatted, value
323
     */
324 7
    protected function getValue($name, $default = null, callable $callback = null)
325
    {
326
327
        // initialize the value
328 7
        $value = null;
329
330
        // query wheter or not, the value with the requested key is available
331 7
        if ($this->hasValue($name)) {
332 7
            $value = $this->row[$this->getHeader($name)];
333
        }
334
335
        // query whether or not, a callback has been passed
336 7
        if ($value != null && is_callable($callback)) {
337 1
            $value = call_user_func($callback, $value);
338
        }
339
340
        // query whether or not
341 7
        if ($value == null && $default != null) {
342
            $value = $default;
343
        }
344
345
        // return the value
346 7
        return $value;
347
    }
348
349
    /**
350
     * Initialize's and return's a new entity with the status 'create'.
351
     *
352
     * @param array $attr The attributes to merge into the new entity
353
     *
354
     * @return array The initialized entity
355
     */
356 4
    protected function initializeEntity(array $attr = array())
357
    {
358 4
        return array_merge(array(EntityStatus::MEMBER_NAME => EntityStatus::STATUS_CREATE), $attr);
359
    }
360
361
    /**
362
     * Merge's and return's the entity with the passed attributes and set's the
363
     * status to 'update'.
364
     *
365
     * @param array $entity The entity to merge the attributes into
366
     * @param array $attr   The attributes to be merged
367
     *
368
     * @return array The merged entity
369
     */
370 2
    protected function mergeEntity(array $entity, array $attr)
371
    {
372 2
        return array_merge($entity, $attr, array(EntityStatus::MEMBER_NAME => EntityStatus::STATUS_UPDATE));
373
    }
374
}
375