Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SimpleProductsFixture.php
Go to the documentation of this file.
1 <?php
7 namespace Magento\Setup\Fixtures;
8 
11 use Magento\Catalog\Model\ProductFactory;
12 use Magento\Eav\Model\ResourceModel\Entity\Attribute\CollectionFactory;
13 use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory as AttributeSetCollectionFactory;
16 
34 {
38  const SKU_PATTERN = 'product_dynamic_%s';
39 
43  protected $priority = 31;
44 
48  private $descriptionConfig;
49 
53  private $shortDescriptionConfig;
54 
58  private $productFactory;
59 
63  private $productGenerator;
64 
68  private $defaultAttributeSetId;
69 
73  private $attributeCollectionFactory;
74 
78  private $attributeSetCollectionFactory;
79 
83  private $descriptionGeneratorFactory;
84 
88  private $productsAmountProvider;
89 
93  private $websiteCategoryProvider;
94 
98  private $priceProvider;
99 
112  public function __construct(
114  ProductFactory $productFactory,
115  ProductGenerator $productGenerator,
116  CollectionFactory $attributeCollectionFactory,
117  AttributeSetCollectionFactory $attributeSetCollectionFactory,
118  SearchTermDescriptionGeneratorFactory $descriptionGeneratorFactory,
119  WebsiteCategoryProvider $websiteCategoryProvider,
120  ProductsAmountProvider $productsAmountProvider,
121  PriceProvider $priceProvider
122  ) {
123  parent::__construct($fixtureModel);
124  $this->productFactory = $productFactory;
125  $this->productGenerator = $productGenerator;
126  $this->attributeCollectionFactory = $attributeCollectionFactory;
127  $this->attributeSetCollectionFactory = $attributeSetCollectionFactory;
128  $this->descriptionGeneratorFactory = $descriptionGeneratorFactory;
129  $this->productsAmountProvider = $productsAmountProvider;
130  $this->websiteCategoryProvider = $websiteCategoryProvider;
131  $this->priceProvider = $priceProvider;
132  }
133 
137  public function getActionTitle()
138  {
139  return 'Generating simple products';
140  }
141 
145  public function introduceParamLabels()
146  {
147  return [
148  'simple_products' => 'Simple products'
149  ];
150  }
151 
156  public function execute()
157  {
158  $simpleProductsCount = $this->productsAmountProvider->getAmount(
159  $this->fixtureModel->getValue('simple_products', 0),
160  $this->getSkuPattern()
161  );
162 
163  if (!$simpleProductsCount) {
164  return;
165  }
166 
167  $defaultAttributeSets = $this->getDefaultAttributeSets();
168  $searchTermsConfig = $this->getSearchTerms();
169 
171  $descriptionGenerator = $this->descriptionGeneratorFactory->create(
172  $this->getDescriptionConfig(),
173  $searchTermsConfig,
174  $simpleProductsCount,
175  'Full simple product Description %s'
176  );
177 
179  $shortDescriptionGenerator = $this->descriptionGeneratorFactory->create(
180  $this->getShortDescriptionConfig(),
181  $searchTermsConfig,
182  $simpleProductsCount,
183  'Short simple product Description %s'
184  );
185 
186  $additionalAttributeSets = $this->getAdditionalAttributeSets();
187  $attributeSet = function ($index) use ($defaultAttributeSets, $additionalAttributeSets) {
188  mt_srand($index);
189  $attributeSetCount = count(array_keys($defaultAttributeSets));
190  if ($attributeSetCount > (($index - 1) % (int)$this->fixtureModel->getValue('categories', 30))) {
191  return array_keys($defaultAttributeSets)[mt_rand(0, count(array_keys($defaultAttributeSets)) - 1)];
192  } else {
193  $customSetsAmount = count($additionalAttributeSets);
194  return $customSetsAmount
195  ? $additionalAttributeSets[$index % count($additionalAttributeSets)]['attribute_set_id']
196  : $this->getDefaultAttributeSetId();
197  }
198  };
199 
200  $additionalAttributes = function (
202  $index
203  ) use (
204  $defaultAttributeSets,
205  $additionalAttributeSets
206  ) {
207  $attributeValues = [];
208  mt_srand($index);
209  if (isset($defaultAttributeSets[$attributeSetId])) {
210  foreach ($defaultAttributeSets[$attributeSetId] as $attributeCode => $values) {
211  $attributeValues[$attributeCode] = $values[mt_rand(0, count($values) - 1)];
212  }
213  }
214 
215  return $attributeValues;
216  };
217 
218  $fixtureMap = [
219  'name' => function ($productId) {
220  return sprintf('Simple Product %s', $productId);
221  },
222  'sku' => function ($productId) {
223  return sprintf($this->getSkuPattern(), $productId);
224  },
225  'price' => function ($index, $entityNumber) {
226  return $this->priceProvider->getPrice($entityNumber);
227  },
228  'url_key' => function ($productId) {
229  return sprintf('simple-product-%s', $productId);
230  },
231  'description' => function ($index) use ($descriptionGenerator) {
232  return $descriptionGenerator->generate($index);
233  },
234  'short_description' => function ($index) use ($shortDescriptionGenerator) {
235  return $shortDescriptionGenerator->generate($index);
236  },
237  'website_ids' => function ($index, $entityNumber) {
238  return $this->websiteCategoryProvider->getWebsiteIds($index);
239  },
240  'category_ids' => function ($index, $entityNumber) {
241  return $this->websiteCategoryProvider->getCategoryId($index);
242  },
243  'attribute_set_id' => $attributeSet,
244  'additional_attributes' => $additionalAttributes,
245  'status' => function () {
246  return Status::STATUS_ENABLED;
247  }
248  ];
249  $this->productGenerator->generate($simpleProductsCount, $fixtureMap);
250  }
251 
257  private function getSkuPattern()
258  {
259  return self::SKU_PATTERN;
260  }
261 
267  private function getDefaultAttributeSetId()
268  {
269  if (null === $this->defaultAttributeSetId) {
270  $this->defaultAttributeSetId = (int)$this->productFactory->create()->getDefaultAttributeSetId();
271  }
272 
273  return $this->defaultAttributeSetId;
274  }
275 
282  private function getDefaultAttributeSets()
283  {
284  $attributeSets = $this->fixtureModel->getValue('attribute_sets', null);
285  $attributes = [];
286 
287  if ($attributeSets !== null && array_key_exists('attribute_set', $attributeSets)) {
288  foreach ($attributeSets['attribute_set'] as $attributeSet) {
289  $attributesData = array_key_exists(0, $attributeSet['attributes']['attribute'])
290  ? $attributeSet['attributes']['attribute'] : [$attributeSet['attributes']['attribute']];
291 
292  $attributeCollection = $this->attributeCollectionFactory->create();
293 
294  $attributeCollection->setAttributeSetFilterBySetName($attributeSet['name'], Product::ENTITY);
295  $attributeCollection->addFieldToFilter(
296  'attribute_code',
297  array_column($attributesData, 'attribute_code')
298  );
300  foreach ($attributeCollection as $attribute) {
301  $values = [];
302  $options = $attribute->getOptions();
303  foreach (($options ?: []) as $option) {
304  if ($option->getValue()) {
305  $values[] = $option->getValue();
306  }
307  }
308  $attributes[$attribute->getAttributeSetId()][$attribute->getAttributeCode()] = $values;
309  }
310  }
311  }
312  $attributes[$this->getDefaultAttributeSetId()] = [];
313 
314  return $attributes;
315  }
316 
322  private function getSearchTerms()
323  {
324  $searchTerms = $this->fixtureModel->getValue('search_terms', []);
325  if (!empty($searchTerms)) {
326  $searchTerms = array_key_exists(0, $searchTerms['search_term'])
327  ? $searchTerms['search_term'] : [$searchTerms['search_term']];
328  }
329 
330  return $searchTerms;
331  }
332 
338  private function getDescriptionConfig()
339  {
340  if (null === $this->descriptionConfig) {
341  $this->descriptionConfig = $this->readDescriptionConfig('description');
342  }
343 
344  return $this->descriptionConfig;
345  }
346 
352  private function getShortDescriptionConfig()
353  {
354  if (null === $this->shortDescriptionConfig) {
355  $this->shortDescriptionConfig = $this->readDescriptionConfig('short-description');
356  }
357 
358  return $this->shortDescriptionConfig;
359  }
360 
367  private function readDescriptionConfig($configSrc)
368  {
369  $configData = $this->fixtureModel->getValue($configSrc, []);
370 
371  if (isset($configData['mixin']['tags'])) {
372  $configData['mixin']['tags'] = explode('|', $configData['mixin']['tags']);
373  }
374 
375  return $configData;
376  }
377 
383  private function getAdditionalAttributeSets()
384  {
386  $sets = $this->attributeSetCollectionFactory->create();
387  $sets->addFieldToFilter('attribute_set_name', ['like' => AttributeSetsFixture::PRODUCT_SET_NAME . '%']);
388 
389  return $sets->getData();
390  }
391 }
__construct(FixtureModel $fixtureModel, ProductFactory $productFactory, ProductGenerator $productGenerator, CollectionFactory $attributeCollectionFactory, AttributeSetCollectionFactory $attributeSetCollectionFactory, SearchTermDescriptionGeneratorFactory $descriptionGeneratorFactory, WebsiteCategoryProvider $websiteCategoryProvider, ProductsAmountProvider $productsAmountProvider, PriceProvider $priceProvider)
$values
Definition: options.phtml:88
$attributesData
$attributeCode
Definition: extend.phtml:12
$attributes
Definition: matrix.phtml:13
$index
Definition: list.phtml:44