Skip to content

Commit dfcc21f

Browse files
MAGETWO-66727: Update performance profiles with swatches
1 parent c7ad941 commit dfcc21f

File tree

7 files changed

+144
-42
lines changed

7 files changed

+144
-42
lines changed

setup/performance-toolkit/profiles/ce/extra_large.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@
1414
<simple_products>600000</simple_products> <!-- Simple products count -->
1515
<configurable_products> <!-- Configurable product -->
1616
<config>
17-
<attributes>1</attributes>
18-
<options>24</options>
17+
<attributes>
18+
<attribute>
19+
<options>3</options>
20+
<swatches>image</swatches>
21+
</attribute>
22+
<attribute>
23+
<options>8</options>
24+
</attribute>
25+
</attributes>
1926
<sku>Configurable Product %s</sku>
2027
<products>16000</products>
2128
</config>

setup/performance-toolkit/profiles/ce/large.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@
1414
<simple_products>300000</simple_products> <!-- Simple products count -->
1515
<configurable_products> <!-- Configurable product -->
1616
<config>
17-
<attributes>1</attributes>
18-
<options>24</options>
17+
<attributes>
18+
<attribute>
19+
<options>3</options>
20+
<swatches>image</swatches>
21+
</attribute>
22+
<attribute>
23+
<options>8</options>
24+
</attribute>
25+
</attributes>
1926
<sku>Configurable Product %s</sku>
2027
<products>8000</products>
2128
</config>

setup/performance-toolkit/profiles/ce/medium.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@
1414
<simple_products>24000</simple_products> <!-- Simple products count -->
1515
<configurable_products> <!-- Configurable product -->
1616
<config>
17-
<attributes>1</attributes>
18-
<options>24</options>
17+
<attributes>
18+
<attribute>
19+
<options>3</options>
20+
<swatches>image</swatches>
21+
</attribute>
22+
<attribute>
23+
<options>8</options>
24+
</attribute>
25+
</attributes>
1926
<sku>Configurable Product %s</sku>
2027
<products>640</products>
2128
</config>

setup/performance-toolkit/profiles/ce/medium_msite.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@
1414
<simple_products>4000</simple_products> <!-- Simple products count -->
1515
<configurable_products> <!-- Configurable product -->
1616
<config>
17-
<attributes>1</attributes>
18-
<options>24</options>
17+
<attributes>
18+
<attribute>
19+
<options>3</options>
20+
<swatches>image</swatches>
21+
</attribute>
22+
<attribute>
23+
<options>8</options>
24+
</attribute>
25+
</attributes>
1926
<sku>Configurable Product %s</sku>
2027
<products>800</products>
2128
</config>

setup/performance-toolkit/profiles/ce/small.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@
1414
<simple_products>800</simple_products> <!-- Simple products count -->
1515
<configurable_products> <!-- Configurable product -->
1616
<config>
17-
<attributes>1</attributes>
18-
<options>24</options>
17+
<attributes>
18+
<attribute>
19+
<options>3</options>
20+
<swatches>image</swatches>
21+
</attribute>
22+
<attribute>
23+
<options>8</options>
24+
</attribute>
25+
</attributes>
1926
<sku>Configurable Product %s</sku>
2027
<products>16</products>
2128
</config>

setup/src/Magento/Setup/Fixtures/AttributeSet/Pattern.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public function generateAttributeSet(
4646
for ($index = 1; $index <= $attributesPerSet; $index++) {
4747
$attributeData = $this->generateAttribute(
4848
$index,
49-
$optionsPerAttribute
49+
is_array($optionsPerAttribute) ? $optionsPerAttribute[$index-1] : $optionsPerAttribute
5050
);
5151
if (is_callable($attributePattern)) {
5252
$attributeData = $attributePattern($index, $attributeData);

setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php

Lines changed: 98 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,25 @@
4747
* </config>
4848
* </configurable_products>
4949
*
50+
* 2.3 Generate products based on dynamically created attribute set with specified configuration per each attribute
51+
* <configurable_products> <!-- Configurable product -->
52+
* <config>
53+
* <attributes>
54+
* <!-- Configuration for a first attribute -->
55+
* <attribute>
56+
* <options>{Amount of options per attribute}</options>
57+
* <swatches>color|image</swatches> Type of Swatch attribute
58+
* </attribute>
59+
* <!-- Configuration for a second attribute -->
60+
* <attribute>
61+
* <options>{Amount of options per attribute}</options>
62+
* </attribute>
63+
* </attributes>
64+
* <sku>{Configurable sku pattern with %s}</sku>
65+
* <products>{Amount of configurable products}</products>
66+
* </config>
67+
* </configurable_products>
68+
*
5069
* Products will be uniformly distributed per categories and websites
5170
* If node "assign_entities_to_all_websites" from profile is set to "1" then products will be assigned to all websites
5271
*
@@ -392,31 +411,16 @@ public function introduceParamLabels()
392411
*/
393412
public function printInfo(OutputInterface $output)
394413
{
395-
$config = $this->fixtureModel->getValue('configurable_products', []);
396-
if (!$config) {
414+
if (!$this->fixtureModel->getValue('configurable_products', [])) {
397415
return;
398416
}
399417

400-
$generalAmount = is_numeric($config) ? $config : array_sum(array_column($config, 'products'));
401-
$output->writeln(sprintf('<info> |- Configurable products: %s</info>', $generalAmount));
402-
403418
$configurableProductConfig = $this->prepareConfigurableConfig(
404419
$this->getDefaultAttributeSetsWithAttributes()
405420
);
421+
$generalAmount = array_sum(array_column($configurableProductConfig, 'products'));
406422

407-
foreach ($configurableProductConfig as $config) {
408-
$attributeSetName = isset($config['attributeSet'])
409-
? $config['attributeSet']
410-
: 'Dynamic Attribute Set ' . $config['attributes'] . '-' . $config['options'];
411-
412-
$output->writeln(
413-
sprintf(
414-
'<info> |--- %s products for attribute set "%s"</info>',
415-
$config['products'],
416-
$attributeSetName
417-
)
418-
);
419-
}
423+
$output->writeln(sprintf('<info> |- Configurable products: %s</info>', $generalAmount));
420424
}
421425

422426
/**
@@ -500,14 +504,19 @@ private function getConfigurableProductConfig()
500504
$skuPull = [];
501505
foreach ($configurableProductConfig as $i => &$config) {
502506
$attributeSet = $config['attributeSet'];
503-
$attributes = (int)$config['attributes'];
507+
$attributes = $config['attributes'];
504508
$options = (int)$config['options'];
505509
if ($attributeSet && isset($defaultAttributeSets[$attributeSet])) {
506510
// process default attribute sets
507511
$attributeSet = $defaultAttributeSets[$attributeSet];
508512
$attributes = count($attributeSet['attributes']);
509513
$options = count($attributeSet['attributes'][0]['values']);
514+
} elseif (is_array($attributes)) {
515+
$attributeSet = $this->getCustomAttributeSet($attributes);
516+
$options = array_column($attributes, 'options');
517+
$attributes = count($attributes);
510518
} elseif ($attributes && $options) {
519+
$attributes = (int)$attributes;
511520
// process dynamic attribute sets
512521
$attributeSet = $this->getAttributeSet($attributes, $options, $config['swatches']);
513522
}
@@ -522,7 +531,7 @@ private function getConfigurableProductConfig()
522531
$config['attributeSet'] = $this->convertAttributesToDBFormat($attributeSet);
523532
$config['attributes'] = $attributes;
524533
$config['options'] = $options;
525-
$config['variationCount'] = pow($options, $attributes);
534+
$config['variationCount'] = is_array($options) ? array_product($options) : pow($options, $attributes);
526535
$skuPull[] = $config['sku'];
527536
}
528537

@@ -556,6 +565,16 @@ private function prepareConfigurableConfig($defaultAttributeSets)
556565
} else {
557566
$configurableConfigs = $configurableConfigs['config'];
558567
}
568+
569+
foreach ($configurableConfigs as &$config) {
570+
if (isset($config['attributes']) && is_array($config['attributes'])) {
571+
if (!isset($config['attributes']['attribute'][0])) {
572+
$config['attributes'] = [$config['attributes']['attribute']];
573+
} else {
574+
$config['attributes'] = $config['attributes']['attribute'];
575+
}
576+
}
577+
}
559578
} else {
560579
throw new ValidatorException(__('Configurable product config is invalid'));
561580
}
@@ -613,11 +632,10 @@ private function getConfigurableSkuPattern($config, $attributeSetName)
613632
private function getAttributeSet($attributes, $options, $swatches)
614633
{
615634
$attributeCode = 'configurable_attribute' . $attributes . '_' . $options . '_';
616-
$setName = 'Dynamic Attribute Set ' . $attributes . '-' . $options;
617635

618636
return $this->attributeSetsFixture->createAttributeSet(
619637
$this->attributePattern->generateAttributeSet(
620-
$setName,
638+
$this->getAttributeSetName($attributes, $options),
621639
$attributes,
622640
$options,
623641
function ($index, $attribute) use ($attributeCode, $options, $swatches) {
@@ -635,6 +653,55 @@ function ($index, $attribute) use ($attributeCode, $options, $swatches) {
635653
);
636654
}
637655

656+
private function getCustomAttributeSet(array $attributes)
657+
{
658+
$attributeSetName = $this->getAttributeSetName(
659+
count($attributes),
660+
implode(',', array_column($attributes, 'options'))
661+
);
662+
663+
$pattern = $this->attributePattern->generateAttributeSet(
664+
$attributeSetName,
665+
count($attributes),
666+
array_column($attributes, 'options'),
667+
function ($index, $attribute) use ($attributeSetName, $attributes) {
668+
$swatch = [];
669+
$timeStamp = time();
670+
$data = [
671+
'attribute_code' => sprintf('custom_attribute_%s_%s', $index, $timeStamp),
672+
'frontend_label' => 'Dynamic Attribute ' . sprintf('custom_attribute_%s_%s', $index, $timeStamp),
673+
];
674+
675+
if (isset($attributes[$index-1]['swatches'])) {
676+
$data['is_visible_in_advanced_search'] = 1;
677+
$data['is_searchable'] = 1;
678+
$data['is_filterable'] = 1;
679+
$data['is_filterable_in_search'] = 1;
680+
$data['used_in_product_listing'] = 1;
681+
682+
$swatch = $this->swatchesGenerator->generateSwatchData(
683+
(int) $attributes[$index-1]['options'],
684+
$attributeSetName . $index,
685+
$attributes[$index-1]['swatches']
686+
);
687+
}
688+
689+
return array_replace_recursive(
690+
$attribute,
691+
$data,
692+
$swatch
693+
);
694+
}
695+
);
696+
697+
return $this->attributeSetsFixture->createAttributeSet($pattern);
698+
}
699+
700+
private function getAttributeSetName($attributesCount, $optionsCount)
701+
{
702+
return sprintf('Dynamic Attribute Set %s-%s', $attributesCount, $optionsCount);
703+
}
704+
638705
/**
639706
* @return array
640707
*/
@@ -689,13 +756,13 @@ private function getConfigurableProductsVariationsValue()
689756
*/
690757
private function getAdditionalAttributesClosure(array $attributes, $variationCount)
691758
{
692-
return function ($attributeSetId, $index, $entityNumber) use ($attributes, $variationCount) {
693-
$variationIndex = $this->getConfigurableVariationIndex($entityNumber, $variationCount) - 1;
694-
$attributeValues = [];
695-
$optionsPerAttribute = count($attributes[0]['values']);
696-
$variationIndex = $variationIndex % $variationCount;
759+
$optionsPerAttribute = array_map(function($attr) {
760+
return count($attr['values']);
761+
}, $attributes);
762+
$variationsMatrix = $this->generateVariationsMatrix(count($attributes), $optionsPerAttribute);
697763

698-
$variationsMatrix = $this->generateVariationsMatrix(count($attributes), $optionsPerAttribute);
764+
return function ($attributeSetId, $index, $entityNumber) use ($attributes, $variationCount, $variationsMatrix) {
765+
$variationIndex = $this->getConfigurableVariationIndex($entityNumber, $variationCount) - 1;
699766
if (isset($variationsMatrix[$variationIndex])) {
700767
$tempProductData = [];
701768
foreach ($variationsMatrix[$variationIndex] as $attributeIndex => $optionIndex) {
@@ -706,7 +773,7 @@ private function getAdditionalAttributesClosure(array $attributes, $variationCou
706773
return $tempProductData;
707774
}
708775

709-
return $attributeValues;
776+
return [];
710777
};
711778
}
712779

@@ -719,8 +786,8 @@ private function getAdditionalAttributesClosure(array $attributes, $variationCou
719786
private function generateVariationsMatrix($attributesPerSet, $optionsPerAttribute)
720787
{
721788
$variationsMatrix = null;
722-
for ($i = 1; $i <= $attributesPerSet; $i++) {
723-
$variationsMatrix[] = range(0, $optionsPerAttribute - 1);
789+
for ($i = 0; $i < $attributesPerSet; $i++) {
790+
$variationsMatrix[] = range(0, $optionsPerAttribute[$i] - 1);
724791
}
725792
return $this->generateVariations($variationsMatrix);
726793
}

0 commit comments

Comments
 (0)