Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
VariationMatrix.php
Go to the documentation of this file.
1 <?php
7 
13 {
20  public function getVariations($usedProductAttributes)
21  {
22  $variationalAttributes = $this->combineVariationalAttributes($usedProductAttributes);
23 
24  $attributesCount = count($variationalAttributes);
25  if ($attributesCount === 0) {
26  return [];
27  }
28 
29  $variations = [];
30  $currentVariation = array_fill(0, $attributesCount, 0);
31  $variationalAttributes = array_reverse($variationalAttributes);
32  $lastAttribute = $attributesCount - 1;
33  do {
34  $this->incrementVariationalIndex($attributesCount, $variationalAttributes, $currentVariation);
35  if ($currentVariation[$lastAttribute] >= count($variationalAttributes[$lastAttribute]['values'])) {
36  break;
37  }
38 
39  $filledVariation = [];
40  for ($attributeIndex = $attributesCount; $attributeIndex--;) {
41  $currentAttribute = $variationalAttributes[$attributeIndex];
42  $currentVariationValue = $currentVariation[$attributeIndex];
43  $filledVariation[$currentAttribute['id']] = $currentAttribute['values'][$currentVariationValue];
44  }
45 
46  $variations[] = $filledVariation;
47  $currentVariation[0]++;
48  } while (true);
49 
50  return $variations;
51  }
52 
59  private function combineVariationalAttributes($usedProductAttributes)
60  {
61  $variationalAttributes = [];
62  foreach ($usedProductAttributes as $attribute) {
63  $options = [];
64  foreach ($attribute['options'] as $valueInfo) {
65  foreach ($attribute['values'] as $priceData) {
66  if (isset($priceData['value_index']) && $priceData['value_index'] == $valueInfo['value']
67  && (!isset($priceData['include']) || $priceData['include'])
68  ) {
69  $valueInfo['price'] = $priceData;
70  $options[] = $valueInfo;
71  }
72  }
73  }
74  $variationalAttributes[] = ['id' => $attribute['attribute_id'], 'values' => $options];
75  }
76  return $variationalAttributes;
77  }
78 
87  private function incrementVariationalIndex($attributesCount, $variationalAttributes, &$currentVariation)
88  {
89  for ($attributeIndex = 0; $attributeIndex < $attributesCount - 1; ++$attributeIndex) {
90  if ($currentVariation[$attributeIndex] >= count($variationalAttributes[$attributeIndex]['values'])) {
91  $currentVariation[$attributeIndex] = 0;
92  ++$currentVariation[$attributeIndex + 1];
93  }
94  }
95  }
96 }