/vendor/magento/module-configurable-sample-data/Model/Product/Converter.php

https://gitlab.com/yousafsyed/easternglamor · PHP · 202 lines · 150 code · 9 blank · 43 comment · 11 complexity · 54a79f862a8a1ac4b5aeca227dc9fc57 MD5 · raw file

  1. <?php
  2. /**
  3. * Copyright © 2016 Magento. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\ConfigurableSampleData\Model\Product;
  7. /**
  8. * Class Converter
  9. */
  10. class Converter extends \Magento\CatalogSampleData\Model\Product\Converter
  11. {
  12. /**
  13. * @var \Magento\ConfigurableProduct\Model\Product\Type\VariationMatrix
  14. */
  15. protected $variationMatrix;
  16. /**
  17. * @param \Magento\Catalog\Model\Category\TreeFactory $categoryTreeFactory
  18. * @param \Magento\Catalog\Model\ResourceModel\Category\TreeFactory $categoryResourceTreeFactory
  19. * @param \Magento\Eav\Model\Config $eavConfig
  20. * @param \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory
  21. * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $attributeCollectionFactory
  22. * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\CollectionFactory $attrOptionCollectionFactory
  23. * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
  24. * @param \Magento\ConfigurableProduct\Model\Product\Type\VariationMatrix $variationMatrix
  25. */
  26. public function __construct(
  27. \Magento\Catalog\Model\Category\TreeFactory $categoryTreeFactory,
  28. \Magento\Catalog\Model\ResourceModel\Category\TreeFactory $categoryResourceTreeFactory,
  29. \Magento\Eav\Model\Config $eavConfig,
  30. \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory,
  31. \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $attributeCollectionFactory,
  32. \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\CollectionFactory $attrOptionCollectionFactory,
  33. \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
  34. \Magento\ConfigurableProduct\Model\Product\Type\VariationMatrix $variationMatrix
  35. ) {
  36. $this->variationMatrix = $variationMatrix;
  37. parent::__construct(
  38. $categoryTreeFactory,
  39. $categoryResourceTreeFactory,
  40. $eavConfig,
  41. $categoryCollectionFactory,
  42. $attributeCollectionFactory,
  43. $attrOptionCollectionFactory,
  44. $productCollectionFactory
  45. );
  46. }
  47. /**
  48. * @param array $row
  49. * @return array
  50. */
  51. public function convertRow($row)
  52. {
  53. $data = parent::convertRow($row);
  54. if (!empty($data['configurable_attributes_data'])) {
  55. $data['configurable_attributes_data'] = $this->convertAttributesData($data['configurable_attributes_data']);
  56. if (!empty($data['associated_product_ids'])) {
  57. $data['associated_product_ids'] = $this->convertSkuToIds(
  58. $this->getArrayValue($data['associated_product_ids'])
  59. );
  60. } else {
  61. $data['variations_matrix'] = $this->getVariationsMatrix($data);
  62. }
  63. $data['new_variations_attribute_set_id'] = $this->getAttributeSetId();
  64. }
  65. return $data;
  66. }
  67. /**
  68. * @inheritdoc
  69. */
  70. protected function convertField(&$data, $field, $value)
  71. {
  72. if (in_array($field, ['color', 'size'])) {
  73. if (!empty($value)) {
  74. $data['configurable_attributes_data'][$field] = $this->getArrayValue($value);
  75. }
  76. return true;
  77. }
  78. return false;
  79. }
  80. /**
  81. * @param array $configurableAttributes
  82. * @return array
  83. */
  84. protected function convertAttributesData($configurableAttributes)
  85. {
  86. $attributesData = [];
  87. foreach ($configurableAttributes as $attributeCode => $values) {
  88. $attribute = $this->eavConfig->getAttribute('catalog_product', $attributeCode);
  89. if (!$attribute->getId()) {
  90. continue;
  91. }
  92. $options = $this->getAttributeOptions($attribute->getAttributeCode());
  93. $attributeValues = [];
  94. $attributeOptions = [];
  95. list($values, $prices) = $this->convertAttributeValues($values);
  96. foreach ($options as $option) {
  97. $price = '';
  98. if (!empty($prices[$option->getValue()])) {
  99. $price = $prices[$option->getValue()];
  100. }
  101. $attributeValues[] = [
  102. 'value_index' => $option->getId(),
  103. 'is_percent' => false,
  104. 'pricing_value' => $price,
  105. 'include' => (int)in_array($option->getValue(), $values),
  106. ];
  107. $attributeOptions[] = [
  108. 'value' => $option->getId(),
  109. 'label' => $option->getValue(),
  110. ];
  111. }
  112. $attributesData[$attribute->getId()] = [
  113. 'id' => '',
  114. 'label' => $attribute->getFrontend()->getLabel(),
  115. 'use_default' => '',
  116. 'position' => $attribute->getAttributeCode() == 'color' ? 10 : '',
  117. 'attribute_id' => $attribute->getId(),
  118. 'attribute_code' => $attribute->getAttributeCode(),
  119. 'code' => $attribute->getAttributeCode(),
  120. 'values' => $attributeValues,
  121. 'options' => $attributeOptions,
  122. ];
  123. }
  124. return $attributesData;
  125. }
  126. /**
  127. * @param array $valuesData
  128. * @return array
  129. */
  130. protected function convertAttributeValues($valuesData)
  131. {
  132. $values = [];
  133. $prices = [];
  134. foreach ($valuesData as $item) {
  135. $itemData = explode(';', $item);
  136. if (!empty($itemData[0])) {
  137. $values[] = $itemData[0];
  138. }
  139. if (!empty($itemData[1])) {
  140. $prices[$itemData[0]] = $itemData[1];
  141. }
  142. }
  143. return [$values, $prices];
  144. }
  145. /**
  146. * @param array $data
  147. * @return array
  148. */
  149. protected function getVariationsMatrix($data)
  150. {
  151. $variations = $this->variationMatrix->getVariations($data['configurable_attributes_data']);
  152. $result = [];
  153. $productPrice = 100;
  154. $productName = $data['name'];
  155. $productSku = $data['sku'];
  156. foreach ($variations as $variation) {
  157. $attributeValues = [];
  158. $attributeLabels = [];
  159. $price = $productPrice;
  160. foreach ($data['configurable_attributes_data'] as $attributeData) {
  161. $attributeId = $attributeData['attribute_id'];
  162. $attributeValues[$attributeData['attribute_code']] = $variation[$attributeId]['value'];
  163. $attributeLabels[$attributeData['attribute_code']] = $variation[$attributeId]['label'];
  164. if (isset($variation[$attributeId]['price'])) {
  165. $priceInfo = $variation[$attributeId]['price'];
  166. $price += ($priceInfo['is_percent'] ? $productPrice / 100.0 : 1.0) * $priceInfo['pricing_value'];
  167. }
  168. }
  169. $key = implode('-', $attributeValues);
  170. $result[$key] = [
  171. 'image' => '',
  172. 'name' => $productName . '-' . implode('-', $attributeLabels),
  173. 'sku' => $productSku . '-' . implode('-', $attributeLabels),
  174. 'configurable_attribute' => \json_encode($attributeValues),
  175. 'quantity_and_stock_status' => ['qty' => '10'],
  176. 'weight' => '1',
  177. ];
  178. }
  179. return $result;
  180. }
  181. /**
  182. * @param array $sku
  183. * @return array
  184. */
  185. protected function convertSkuToIds($sku)
  186. {
  187. $ids = [];
  188. foreach ($sku as $item) {
  189. $ids[] = $this->getProductIdBySku($item);
  190. }
  191. return $ids;
  192. }
  193. }