![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/setup/src/Magento/Setup/Fixtures/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Setup\Fixtures; use Magento\Bundle\Api\Data\LinkInterface; use Magento\Bundle\Model\Product\Type; use Magento\Catalog\Model\Product\Visibility; /** * Generate bundle products based on profile configuration * Generated bundle selections are not displayed individually in catalog * Support the following format: * <bundle_products>{products amount}</bundle_products> * <bundle_products_options>{bundle product options amount}</bundle_products_options> * <bundle_products_variation>{amount of simple products per each option}</bundle_products_variation> * * Products will be uniformly distributed per categories and websites * If node "assign_entities_to_all_websites" from profile is set to "1" then products will be assigned to all websites * * @see setup/performance-toolkit/profiles/ce/small.xml * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class BundleProductsFixture extends Fixture { /** * Bundle sku pattern with entity number and suffix. Suffix equals "{options}-{variations_per_option}" */ const SKU_PATTERN = 'Bundle Product %s - %s'; /** * @var int */ protected $priority = 42; /** * @var \Magento\Setup\Model\FixtureGenerator\ProductGenerator */ private $productGenerator; /** * @var \Magento\Setup\Model\FixtureGenerator\BundleProductGenerator */ private $bundleProductGenerator; /** * @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory */ private $productCollectionFactory; /** * @var int */ private $productStartIndex; /** * @var ProductsAmountProvider */ private $productsAmountProvider; /** * @var WebsiteCategoryProvider */ private $websiteCategoryProvider; /** * @var PriceProvider */ private $priceProvider; /** * @param FixtureModel $fixtureModel * @param \Magento\Setup\Model\FixtureGenerator\ProductGenerator $productGenerator * @param \Magento\Setup\Model\FixtureGenerator\BundleProductGenerator $bundleProductGenerator * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory * @param ProductsAmountProvider $productsAmountProvider * @param WebsiteCategoryProvider $websiteCategoryProvider * @param PriceProvider $priceProvider */ public function __construct( FixtureModel $fixtureModel, \Magento\Setup\Model\FixtureGenerator\ProductGenerator $productGenerator, \Magento\Setup\Model\FixtureGenerator\BundleProductGenerator $bundleProductGenerator, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, ProductsAmountProvider $productsAmountProvider, WebsiteCategoryProvider $websiteCategoryProvider, PriceProvider $priceProvider ) { parent::__construct($fixtureModel); $this->productGenerator = $productGenerator; $this->bundleProductGenerator = $bundleProductGenerator; $this->productCollectionFactory = $productCollectionFactory; $this->productsAmountProvider = $productsAmountProvider; $this->websiteCategoryProvider = $websiteCategoryProvider; $this->priceProvider = $priceProvider; } /** * @inheritdoc * * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ public function execute() { $bundlesAmount = $this->fixtureModel->getValue('bundle_products', 0); $bundleOptions = $this->fixtureModel->getValue('bundle_products_options', 1); $bundleProductsPerOption = $this->fixtureModel->getValue('bundle_products_variation', 10); $bundleOptionSuffix = $bundleOptions . '-' . $bundleProductsPerOption; $variationCount = $bundleOptions * $bundleProductsPerOption; $bundlesAmount = $this->productsAmountProvider->getAmount( $bundlesAmount, $this->getBundleSkuPattern($bundleOptionSuffix) ); if (!$bundlesAmount) { return; } $variationSkuClosure = function ($productId, $entityNumber) use ($bundleOptionSuffix, $variationCount) { $productIndex = $this->getBundleProductIndex($entityNumber, $variationCount); $variationIndex = $this->getBundleVariationIndex($entityNumber, $variationCount); return sprintf($this->getBundleOptionItemSkuPattern($bundleOptionSuffix), $productIndex, $variationIndex); }; $fixtureMap = [ 'name' => $variationSkuClosure, 'sku' => $variationSkuClosure, 'price' => function ($index, $entityNumber) { return $this->priceProvider->getPrice($entityNumber); }, 'website_ids' => function ($index, $entityNumber) use ($variationCount) { $configurableIndex = $this->getBundleProductIndex($entityNumber, $variationCount); return $this->websiteCategoryProvider->getWebsiteIds($configurableIndex); }, 'visibility' => Visibility::VISIBILITY_NOT_VISIBLE, ]; $this->productGenerator->generate($bundlesAmount * $bundleOptions * $bundleProductsPerOption, $fixtureMap); $optionPriceType = [ LinkInterface::PRICE_TYPE_FIXED, LinkInterface::PRICE_TYPE_PERCENT, ]; $priceTypeClosure = function ($index) use ($optionPriceType) { return $optionPriceType[$index % count($optionPriceType)]; }; $skuClosure = function ($index, $entityNumber) use ($bundleOptionSuffix) { return sprintf( $this->getBundleSkuPattern($bundleOptionSuffix), $entityNumber + $this->getNewProductStartIndex() ); }; $fixtureMap = [ '_bundle_options' => $bundleOptions, '_bundle_products_per_option' => $bundleProductsPerOption, '_bundle_variation_sku_pattern' => sprintf( $this->getBundleOptionItemSkuPattern($bundleOptionSuffix), $this->getNewProductStartIndex(), '%s' ), 'type_id' => Type::TYPE_CODE, 'name' => $skuClosure, 'sku' => $skuClosure, 'meta_title' => $skuClosure, 'price' => function ($index) use ($priceTypeClosure) { // phpcs:ignore Magento2.Functions.DiscouragedFunction return $priceTypeClosure($index) === LinkInterface::PRICE_TYPE_PERCENT // mt_rand() here is not for cryptographic use. // phpcs:ignore Magento2.Security.InsecureFunction ? mt_rand(10, 90) : $this->priceProvider->getPrice($index); }, 'priceType' => $priceTypeClosure, 'website_ids' => function ($index, $entityNumber) { return $this->websiteCategoryProvider->getWebsiteIds($entityNumber + $this->getNewProductStartIndex()); }, 'category_ids' => function ($index, $entityNumber) { return $this->websiteCategoryProvider->getCategoryId($entityNumber + $this->getNewProductStartIndex()); }, ]; $this->bundleProductGenerator->generate($bundlesAmount, $fixtureMap); } /** * Get sku pattern for bundle product option item * * @param string $bundleOptionSuffix * @return string */ private function getBundleOptionItemSkuPattern($bundleOptionSuffix) { return $this->getBundleSkuPattern($bundleOptionSuffix) . ' - option %s'; } /** * Get sku pattern for bundle product. Replace suffix pattern with passed value * * @param string $bundleOptionSuffix * @return string */ private function getBundleSkuPattern($bundleOptionSuffix) { return sprintf(self::SKU_PATTERN, '%s', $bundleOptionSuffix); } /** * Get start index for product number generation * * @return int */ private function getNewProductStartIndex() { if (null === $this->productStartIndex) { $this->productStartIndex = $this->productCollectionFactory->create() ->addFieldToFilter('type_id', Type::TYPE_CODE) ->getSize() + 1; } return $this->productStartIndex; } /** * Get bundle product index number * * @param int $entityNumber * @param int $variationCount * @return float */ private function getBundleProductIndex($entityNumber, $variationCount) { return floor($entityNumber / $variationCount) + $this->getNewProductStartIndex(); } /** * Get bundle variation index number * * @param int $entityNumber * @param int $variationCount * @return float */ private function getBundleVariationIndex($entityNumber, $variationCount) { return $entityNumber % $variationCount + 1; } /** * @inheritdoc */ public function getActionTitle() { return 'Generating bundle products'; } /** * @inheritdoc */ public function introduceParamLabels() { return [ 'bundle_products' => 'Bundle products', ]; } }