|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
/** |
|
4
|
|
|
* TechDivision\Import\Product\Bundle\Observers\BundleSelectionObserver |
|
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-bundle |
|
18
|
|
|
* @link http://www.techdivision.com |
|
19
|
|
|
*/ |
|
20
|
|
|
|
|
21
|
|
|
namespace TechDivision\Import\Product\Bundle\Observers; |
|
22
|
|
|
|
|
23
|
|
|
use TechDivision\Import\Utils\StoreViewCodes; |
|
24
|
|
|
use TechDivision\Import\Product\Observers\AbstractProductImportObserver; |
|
25
|
|
|
use TechDivision\Import\Product\Bundle\Utils\ColumnKeys; |
|
26
|
|
|
use TechDivision\Import\Product\Bundle\Utils\MemberNames; |
|
27
|
|
|
use TechDivision\Import\Product\Bundle\Services\ProductBundleProcessorInterface; |
|
28
|
|
|
|
|
29
|
|
|
/** |
|
30
|
|
|
* Oberserver that provides functionality for the bundle selection replace operation. |
|
31
|
|
|
* |
|
32
|
|
|
* @author Tim Wagner <[email protected]> |
|
33
|
|
|
* @copyright 2016 TechDivision GmbH <[email protected]> |
|
34
|
|
|
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) |
|
35
|
|
|
* @link https://github.com/techdivision/import-product-bundle |
|
36
|
|
|
* @link http://www.techdivision.com |
|
37
|
|
|
*/ |
|
38
|
|
|
class BundleSelectionObserver extends AbstractProductImportObserver |
|
39
|
|
|
{ |
|
40
|
|
|
|
|
41
|
|
|
/** |
|
42
|
|
|
* The product bundle processor instance. |
|
43
|
|
|
* |
|
44
|
|
|
* @var \TechDivision\Import\Product\Bundle\Services\ProductBundleProcessorInterface |
|
45
|
|
|
*/ |
|
46
|
|
|
protected $productBundleProcessor; |
|
47
|
|
|
|
|
48
|
|
|
/** |
|
49
|
|
|
* Initialize the observer with the passed product bundle processor instance. |
|
50
|
|
|
* |
|
51
|
|
|
* @param \TechDivision\Import\Product\Bundle\Services\ProductBundleProcessorInterface $productBundleProcessor The product bundle processor instance |
|
52
|
|
|
*/ |
|
53
|
|
|
public function __construct(ProductBundleProcessorInterface $productBundleProcessor) |
|
54
|
|
|
{ |
|
55
|
|
|
$this->productBundleProcessor = $productBundleProcessor; |
|
56
|
|
|
} |
|
57
|
|
|
|
|
58
|
|
|
/** |
|
59
|
|
|
* Return's the product bundle processor instance. |
|
60
|
|
|
* |
|
61
|
|
|
* @return \TechDivision\Import\Product\Bundle\Services\ProductBundleProcessorInterface The product bundle processor instance |
|
62
|
|
|
*/ |
|
63
|
|
|
protected function getProductBundleProcessor() |
|
64
|
|
|
{ |
|
65
|
|
|
return $this->productBundleProcessor; |
|
66
|
|
|
} |
|
67
|
|
|
|
|
68
|
|
|
/** |
|
69
|
|
|
* Process the observer's business logic. |
|
70
|
|
|
* |
|
71
|
|
|
* @return array The processed row |
|
72
|
|
|
*/ |
|
73
|
|
|
protected function process() |
|
74
|
|
|
{ |
|
75
|
|
|
|
|
76
|
|
|
// prepare the store view code |
|
77
|
|
|
$this->prepareStoreViewCode($this->getRow()); |
|
|
|
|
|
|
78
|
|
|
|
|
79
|
|
|
// return immediately if we're have no store view code set |
|
80
|
|
|
if (StoreViewCodes::ADMIN !== $this->getStoreViewCode(StoreViewCodes::ADMIN)) { |
|
81
|
|
|
return; |
|
82
|
|
|
} |
|
83
|
|
|
|
|
84
|
|
|
// prepare, initialize and persist the product bundle selection data |
|
85
|
|
|
$productBundleSelection = $this->initializeBundleSelection($this->prepareAttributes()); |
|
86
|
|
|
$selectionId = $this->persistProductBundleSelection($productBundleSelection); |
|
87
|
|
|
|
|
88
|
|
|
// add the mapping for the child SKU => selection ID |
|
89
|
|
|
$this->addChildSkuSelectionIdMapping($this->getValue(ColumnKeys::BUNDLE_VALUE_SKU), $selectionId); |
|
90
|
|
|
} |
|
91
|
|
|
|
|
92
|
|
|
/** |
|
93
|
|
|
* Prepare the attributes of the entity that has to be persisted. |
|
94
|
|
|
* |
|
95
|
|
|
* @return array The prepared attributes |
|
96
|
|
|
*/ |
|
97
|
|
|
protected function prepareAttributes() |
|
98
|
|
|
{ |
|
99
|
|
|
|
|
100
|
|
|
// load the actual option ID |
|
101
|
|
|
$optionId = $this->getLastOptionId(); |
|
102
|
|
|
|
|
103
|
|
|
try { |
|
104
|
|
|
// load and map the parent SKU |
|
105
|
|
|
$parentId = $this->mapSku($this->getValue(ColumnKeys::BUNDLE_PARENT_SKU)); |
|
106
|
|
|
} catch (\Exception $e) { |
|
107
|
|
|
throw $this->wrapException(array(ColumnKeys::BUNDLE_PARENT_SKU), $e); |
|
|
|
|
|
|
108
|
|
|
} |
|
109
|
|
|
|
|
110
|
|
|
try { |
|
111
|
|
|
// try to load the child ID |
|
112
|
|
|
$childId = $this->mapSkuToEntityId($this->getValue(ColumnKeys::BUNDLE_VALUE_SKU)); |
|
113
|
|
|
} catch (\Exception $e) { |
|
114
|
|
|
throw $this->wrapException(array(ColumnKeys::BUNDLE_VALUE_SKU), $e); |
|
|
|
|
|
|
115
|
|
|
} |
|
116
|
|
|
|
|
117
|
|
|
try { |
|
118
|
|
|
// try to load the selection price type |
|
119
|
|
|
$selectionPriceType = $this->mapPriceType($this->getValue(ColumnKeys::BUNDLE_VALUE_PRICE_TYPE)); |
|
120
|
|
|
} catch (\Exception $e) { |
|
121
|
|
|
throw $this->wrapException(array(ColumnKeys::BUNDLE_VALUE_PRICE_TYPE), $e); |
|
|
|
|
|
|
122
|
|
|
} |
|
123
|
|
|
|
|
124
|
|
|
// load the default values |
|
125
|
|
|
$selectionCanChangeQty = $this->getValue(ColumnKeys::BUNDLE_VALUE_CAN_CHANGE_QTY, 0); |
|
126
|
|
|
$selectionPriceValue = $this->getValue(ColumnKeys::BUNDLE_VALUE_PRICE); |
|
127
|
|
|
$selectionQty = $this->getValue(ColumnKeys::BUNDLE_VALUE_DEFAULT_QTY); |
|
128
|
|
|
$isDefault = $this->getValue(ColumnKeys::BUNDLE_VALUE_DEFAULT); |
|
129
|
|
|
|
|
130
|
|
|
// laod the position counter |
|
131
|
|
|
$position = $this->raisePositionCounter(); |
|
132
|
|
|
|
|
133
|
|
|
// prepare the product bundle selection data |
|
134
|
|
|
return $this->initializeEntity( |
|
135
|
|
|
array( |
|
136
|
|
|
MemberNames::OPTION_ID => $optionId, |
|
137
|
|
|
MemberNames::PARENT_PRODUCT_ID => $parentId, |
|
138
|
|
|
MemberNames::PRODUCT_ID => $childId, |
|
139
|
|
|
MemberNames::POSITION => $position, |
|
140
|
|
|
MemberNames::IS_DEFAULT => $isDefault, |
|
141
|
|
|
MemberNames::SELECTION_PRICE_TYPE => $selectionPriceType, |
|
142
|
|
|
MemberNames::SELECTION_PRICE_VALUE => $selectionPriceValue, |
|
143
|
|
|
MemberNames::SELECTION_QTY => $selectionQty, |
|
144
|
|
|
MemberNames::SELECTION_CAN_CHANGE_QTY => $selectionCanChangeQty |
|
145
|
|
|
) |
|
146
|
|
|
); |
|
147
|
|
|
} |
|
148
|
|
|
|
|
149
|
|
|
/** |
|
150
|
|
|
* Initialize the bundle selection with the passed attributes and returns an instance. |
|
151
|
|
|
* |
|
152
|
|
|
* @param array $attr The bundle selection attributes |
|
153
|
|
|
* |
|
154
|
|
|
* @return array The initialized bundle selection |
|
155
|
|
|
*/ |
|
156
|
|
|
protected function initializeBundleSelection(array $attr) |
|
157
|
|
|
{ |
|
158
|
|
|
return $attr; |
|
159
|
|
|
} |
|
160
|
|
|
|
|
161
|
|
|
/** |
|
162
|
|
|
* Return's the last created option ID. |
|
163
|
|
|
* |
|
164
|
|
|
* @return integer $optionId The last created option ID |
|
165
|
|
|
*/ |
|
166
|
|
|
protected function getLastOptionId() |
|
167
|
|
|
{ |
|
168
|
|
|
return $this->getSubject()->getLastOptionId(); |
|
|
|
|
|
|
169
|
|
|
} |
|
170
|
|
|
|
|
171
|
|
|
/** |
|
172
|
|
|
* Save's the mapping of the child SKU and the selection ID. |
|
173
|
|
|
* |
|
174
|
|
|
* @param string $childSku The child SKU of the selection |
|
175
|
|
|
* @param integer $selectionId The selection ID to save |
|
176
|
|
|
* |
|
177
|
|
|
* @return void |
|
178
|
|
|
*/ |
|
179
|
|
|
protected function addChildSkuSelectionIdMapping($childSku, $selectionId) |
|
180
|
|
|
{ |
|
181
|
|
|
$this->getSubject()->addChildSkuSelectionIdMapping($childSku, $selectionId); |
|
|
|
|
|
|
182
|
|
|
} |
|
183
|
|
|
|
|
184
|
|
|
/** |
|
185
|
|
|
* Returns the acutal value of the position counter and raise's it by one. |
|
186
|
|
|
* |
|
187
|
|
|
* @return integer The actual value of the position counter |
|
188
|
|
|
*/ |
|
189
|
|
|
protected function raisePositionCounter() |
|
190
|
|
|
{ |
|
191
|
|
|
return $this->getSubject()->raisePositionCounter(); |
|
|
|
|
|
|
192
|
|
|
} |
|
193
|
|
|
|
|
194
|
|
|
/** |
|
195
|
|
|
* Return's the mapping for the passed price type. |
|
196
|
|
|
* |
|
197
|
|
|
* @param string $priceType The price type to map |
|
198
|
|
|
* |
|
199
|
|
|
* @return integer The mapped price type |
|
200
|
|
|
* @throws \Exception Is thrown, if the passed price type can't be mapped |
|
201
|
|
|
*/ |
|
202
|
|
|
protected function mapPriceType($priceType) |
|
203
|
|
|
{ |
|
204
|
|
|
return $this->getSubject()->mapPriceType($priceType); |
|
|
|
|
|
|
205
|
|
|
} |
|
206
|
|
|
|
|
207
|
|
|
/** |
|
208
|
|
|
* Return the entity ID for the passed SKU. |
|
209
|
|
|
* |
|
210
|
|
|
* @param string $sku The SKU to return the entity ID for |
|
211
|
|
|
* |
|
212
|
|
|
* @return integer The mapped entity ID |
|
213
|
|
|
* @throws \Exception Is thrown if the SKU is not mapped yet |
|
214
|
|
|
*/ |
|
215
|
|
|
protected function mapSku($sku) |
|
216
|
|
|
{ |
|
217
|
|
|
return $this->getSubject()->mapSkuToEntityId($sku); |
|
|
|
|
|
|
218
|
|
|
} |
|
219
|
|
|
|
|
220
|
|
|
/** |
|
221
|
|
|
* Return the entity ID for the passed SKU. |
|
222
|
|
|
* |
|
223
|
|
|
* @param string $sku The SKU to return the entity ID for |
|
224
|
|
|
* |
|
225
|
|
|
* @return integer The mapped entity ID |
|
226
|
|
|
* @throws \Exception Is thrown if the SKU is not mapped yet |
|
227
|
|
|
*/ |
|
228
|
|
|
protected function mapSkuToEntityId($sku) |
|
229
|
|
|
{ |
|
230
|
|
|
return $this->getSubject()->mapSkuToEntityId($sku); |
|
|
|
|
|
|
231
|
|
|
} |
|
232
|
|
|
|
|
233
|
|
|
/** |
|
234
|
|
|
* Persist's the passed product bundle selection data and return's the ID. |
|
235
|
|
|
* |
|
236
|
|
|
* @param array $productBundleSelection The product bundle selection data to persist |
|
237
|
|
|
* |
|
238
|
|
|
* @return string The ID of the persisted entity |
|
239
|
|
|
*/ |
|
240
|
|
|
protected function persistProductBundleSelection($productBundleSelection) |
|
241
|
|
|
{ |
|
242
|
|
|
return $this->getProductBundleProcessor()->persistProductBundleSelection($productBundleSelection); |
|
243
|
|
|
} |
|
244
|
|
|
} |
|
245
|
|
|
|
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.
If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.
In this case you can add the
@ignorePhpDoc annotation to the duplicate definition and it will be ignored.