@@ -25,6 +25,12 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
25
25
/**
26
26
* Error codes.
27
27
*/
28
+ const ERROR_ATTRIBUTE_CODE_DOES_NOT_EXIST = 'attrCodeDoesNotExist ' ;
29
+
30
+ const ERROR_ATTRIBUTE_CODE_NOT_GLOBAL_SCOPE = 'attrCodeNotGlobalScope ' ;
31
+
32
+ const ERROR_ATTRIBUTE_CODE_NOT_TYPE_SELECT = 'attrCodeNotTypeSelect ' ;
33
+
28
34
const ERROR_ATTRIBUTE_CODE_IS_NOT_SUPER = 'attrCodeIsNotSuper ' ;
29
35
30
36
const ERROR_INVALID_OPTION_VALUE = 'invalidOptionValue ' ;
@@ -39,10 +45,19 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
39
45
* Validation failure message template definitions
40
46
*
41
47
* @var array
48
+ *
49
+ * Note: Some of these messages exceed maximum limit of 120 characters per line. Split up accordingly.
42
50
*/
43
51
protected $ _messageTemplates = [
44
- self ::ERROR_ATTRIBUTE_CODE_IS_NOT_SUPER => 'Attribute with code "%s" is not super ' ,
45
- self ::ERROR_INVALID_OPTION_VALUE => 'Invalid option value for attribute "%s" ' ,
52
+ self ::ERROR_ATTRIBUTE_CODE_DOES_NOT_EXIST => 'Column configurable_variations: Attribute with code ' .
53
+ '"%s" does not exist or is missing from product attribute set ' ,
54
+ self ::ERROR_ATTRIBUTE_CODE_NOT_GLOBAL_SCOPE => 'Column configurable_variations: Attribute with code ' .
55
+ '"%s" is not super - it needs to have Global Scope ' ,
56
+ self ::ERROR_ATTRIBUTE_CODE_NOT_TYPE_SELECT => 'Column configurable_variations: Attribute with code ' .
57
+ '"%s" is not super - it needs to be Input Type of Dropdown, Visual Swatch or Text Swatch ' ,
58
+ self ::ERROR_ATTRIBUTE_CODE_IS_NOT_SUPER => 'Column configurable_variations: Attribute with code ' .
59
+ '"%s" is not super ' ,
60
+ self ::ERROR_INVALID_OPTION_VALUE => 'Column configurable_variations: Invalid option value for attribute "%s" ' ,
46
61
self ::ERROR_INVALID_WEBSITE => 'Invalid website code for super attribute ' ,
47
62
self ::ERROR_DUPLICATED_VARIATIONS => 'SKU %s contains duplicated variations ' ,
48
63
self ::ERROR_UNIDENTIFIABLE_VARIATION => 'Configurable variation "%s" is unidentifiable ' ,
@@ -289,10 +304,11 @@ protected function _isParticularAttributesValid(array $rowData, $rowNum)
289
304
{
290
305
if (!empty ($ rowData ['_super_attribute_code ' ])) {
291
306
$ superAttrCode = $ rowData ['_super_attribute_code ' ];
292
-
293
307
if (!$ this ->_isAttributeSuper ($ superAttrCode )) {
294
- // check attribute superity
295
- $ this ->_entityModel ->addRowError (self ::ERROR_ATTRIBUTE_CODE_IS_NOT_SUPER , $ rowNum , $ superAttrCode );
308
+ // Identify reason why attribute is not super:
309
+ if (!$ this ->identifySuperAttributeError ($ superAttrCode , $ rowNum )) {
310
+ $ this ->_entityModel ->addRowError (self ::ERROR_ATTRIBUTE_CODE_IS_NOT_SUPER , $ rowNum , $ superAttrCode );
311
+ }
296
312
return false ;
297
313
} elseif (isset ($ rowData ['_super_attribute_option ' ]) && strlen ($ rowData ['_super_attribute_option ' ])) {
298
314
$ optionKey = strtolower ($ rowData ['_super_attribute_option ' ]);
@@ -305,6 +321,66 @@ protected function _isParticularAttributesValid(array $rowData, $rowNum)
305
321
return true ;
306
322
}
307
323
324
+ /**
325
+ * Identify exactly why a super attribute code is not super.
326
+ *
327
+ * @param string $superAttrCode
328
+ * @param int $rowNum
329
+ * @return bool
330
+ */
331
+ private function identifySuperAttributeError ($ superAttrCode , $ rowNum )
332
+ {
333
+ // This attribute code is not a super attribute. Need to give a clearer message why?
334
+ $ reasonFound = false ;
335
+ $ codeExists = false ;
336
+
337
+ // Does this attribute code exist?
338
+ $ sourceAttribute = $ this ->doesSuperAttributeExist ($ superAttrCode );
339
+ if (is_array ($ sourceAttribute )) {
340
+ $ codeExists = true ;
341
+ // Does attribute have the correct settings?
342
+ if (isset ($ sourceAttribute ['is_global ' ]) && $ sourceAttribute ['is_global ' ] !== '1 ' ) {
343
+ $ this ->_entityModel ->addRowError (self ::ERROR_ATTRIBUTE_CODE_NOT_GLOBAL_SCOPE , $ rowNum , $ superAttrCode );
344
+ $ reasonFound = true ;
345
+ } elseif (isset ($ sourceAttribute ['type ' ]) && $ sourceAttribute ['type ' ] !== 'select ' ) {
346
+ $ this ->_entityModel ->addRowError (self ::ERROR_ATTRIBUTE_CODE_NOT_TYPE_SELECT , $ rowNum , $ superAttrCode );
347
+ $ reasonFound = true ;
348
+ }
349
+ }
350
+
351
+ if ($ codeExists === false ) {
352
+ $ this ->_entityModel ->addRowError (self ::ERROR_ATTRIBUTE_CODE_DOES_NOT_EXIST , $ rowNum , $ superAttrCode );
353
+ $ reasonFound = true ;
354
+ }
355
+
356
+ return $ reasonFound ;
357
+ }
358
+
359
+ /**
360
+ * Does the super attribute exist in the current attribute set?
361
+ *
362
+ * @param string $superAttrCode
363
+ * @return array
364
+ */
365
+ private function doesSuperAttributeExist ($ superAttrCode )
366
+ {
367
+ $ returnAttributeArray = null ;
368
+ if (is_array (self ::$ commonAttributesCache )) {
369
+ $ filteredAttribute = array_filter (
370
+ self ::$ commonAttributesCache ,
371
+ function ($ element ) use ($ superAttrCode ) {
372
+ return $ element ['code ' ] == $ superAttrCode ;
373
+ }
374
+ );
375
+
376
+ // Return the first element of the filtered array (if found).
377
+ if (count ($ filteredAttribute )) {
378
+ $ returnAttributeArray = array_shift ($ filteredAttribute );
379
+ }
380
+ }
381
+ return $ returnAttributeArray ;
382
+ }
383
+
308
384
/**
309
385
* Array of SKU to array of super attribute values for all products.
310
386
*
0 commit comments