Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ConfigurableProductTemplateGenerator.php
Go to the documentation of this file.
1 <?php
8 
12 use Magento\Catalog\Model\ProductFactory;
16 
22 {
26  private $fixture;
27 
31  private $productFactory;
32 
36  private $optionFactory;
37 
41  private $resourceConnection;
42 
49  public function __construct(
50  ProductFactory $productFactory,
51  array $fixture,
52  OptionFactory $optionFactory,
53  ResourceConnection $resourceConnection
54  ) {
55  $this->fixture = $fixture;
56  $this->productFactory = $productFactory;
57  $this->optionFactory = $optionFactory;
58  $this->resourceConnection = $resourceConnection;
59  }
60 
64  public function generateEntity()
65  {
66  $attributeSet = $this->fixture['attribute_set_id'];
67  $product = $this->getProductTemplate($attributeSet);
68  $product->save();
69 
70  return $product;
71  }
72 
79  private function getProductTemplate($attributeSet)
80  {
81  $productRandomizerNumber = crc32(random_int(1, PHP_INT_MAX));
82  $product = $this->productFactory->create([
83  'data' => [
84  'attribute_set_id' => $attributeSet,
85  'type_id' => Configurable::TYPE_CODE,
86  'name' => 'template name' . $productRandomizerNumber,
87  'url_key' => 'template-url' . $productRandomizerNumber,
88  'sku' => 'template_sku_configurable' . $productRandomizerNumber,
89  'meta_description' => 'Configurable Product',
90  'meta_keyword' => $productRandomizerNumber,
91  'meta_title' => $productRandomizerNumber,
92  'price' => 10,
93  'visibility' => Visibility::VISIBILITY_BOTH,
94  'status' => Status::STATUS_ENABLED,
95  'website_ids' => (array)$this->fixture['website_ids'](1, 0),
96  'category_ids' => isset($this->fixture['category_ids']) ? [2] : null,
97  'weight' => 1,
98  'description' => 'description',
99  'short_description' => 'short description',
100  'tax_class_id' => 2, //'taxable goods',
101  'stock_data' => [
102  'use_config_manage_stock' => 1,
103  'qty' => 100500,
104  'is_qty_decimal' => 0,
105  'is_in_stock' => 1
106  ],
107  // Need for set "has_options" field
108  'can_save_configurable_attributes' => true,
109  'configurable_attributes_data' => $this->fixture['_attributes'],
110  ]
111  ]);
112 
113  $attributes = [];
114  foreach ($this->fixture['_attributes'] as $index => $attribute) {
115  $attributeValues = [];
116  foreach ($attribute['values'] as $value) {
117  $attributeValues[] = [
118  'label' => $attribute['name'],
119  'attribute_id' => $attribute['id'],
120  'value_index' => $value
121  ];
122  }
123  $attributes[] = [
124  'attribute_id' => $attribute['id'],
125  'code' => $attribute['name'],
126  'label' => $attribute['name'],
127  'position' => $index,
128  'values' => $attributeValues,
129  ];
130  }
131  $configurableOptions = $this->optionFactory->create($attributes);
132  $extensionConfigurableAttributes = $product->getExtensionAttributes();
133  $extensionConfigurableAttributes->setConfigurableProductOptions($configurableOptions);
134  $extensionConfigurableAttributes->setConfigurableProductLinks($this->getAssociatedProductIds());
135  $product->setExtensionAttributes($extensionConfigurableAttributes);
136 
137  return $product;
138  }
139 
146  private function getAssociatedProductIds()
147  {
149  $connection = $this->resourceConnection->getConnection();
150  $firstSimpleProductId = $connection->fetchRow(
151  $connection->select()
152  ->from($this->resourceConnection->getTableName('catalog_product_entity'))
153  ->where('sku = ?', $this->fixture['_variation_sku_pattern'])
154  )['entity_id'];
155 
156  for ($i = 0; $i < $this->fixture['_variation_count']; $i++) {
157  $associatedProductIds[] = $firstSimpleProductId + $i;
158  }
159 
160  return $associatedProductIds;
161  }
162 }
$value
Definition: gender.phtml:16
$attributes
Definition: matrix.phtml:13
$connection
Definition: bulk.php:13
__construct(ProductFactory $productFactory, array $fixture, OptionFactory $optionFactory, ResourceConnection $resourceConnection)
$extensionConfigurableAttributes
$i
Definition: gallery.phtml:31
$index
Definition: list.phtml:44