Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Copier.php
Go to the documentation of this file.
1 <?php
9 
11 
12 class Copier
13 {
17  protected $optionRepository;
18 
22  protected $copyConstructor;
23 
27  protected $productFactory;
28 
32  protected $metadataPool;
33 
38  public function __construct(
40  \Magento\Catalog\Model\ProductFactory $productFactory
41  ) {
42  $this->productFactory = $productFactory;
43  $this->copyConstructor = $copyConstructor;
44  }
45 
52  public function copy(\Magento\Catalog\Model\Product $product)
53  {
54  $product->getWebsiteIds();
55  $product->getCategoryIds();
56 
58  $metadata = $this->getMetadataPool()->getMetadata(ProductInterface::class);
59 
61  $duplicate = $this->productFactory->create();
62  $productData = $product->getData();
63  $productData = $this->removeStockItem($productData);
64  $duplicate->setData($productData);
65  $duplicate->setOptions([]);
66  $duplicate->setIsDuplicate(true);
67  $duplicate->setOriginalLinkId($product->getData($metadata->getLinkField()));
68  $duplicate->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
69  $duplicate->setCreatedAt(null);
70  $duplicate->setUpdatedAt(null);
71  $duplicate->setId(null);
72  $duplicate->setStoreId(\Magento\Store\Model\Store::DEFAULT_STORE_ID);
73 
74  $this->copyConstructor->build($product, $duplicate);
75  $isDuplicateSaved = false;
76  do {
77  $urlKey = $duplicate->getUrlKey();
78  $urlKey = preg_match('/(.*)-(\d+)$/', $urlKey, $matches)
79  ? $matches[1] . '-' . ($matches[2] + 1)
80  : $urlKey . '-1';
81  $duplicate->setUrlKey($urlKey);
82  try {
83  $duplicate->save();
84  $isDuplicateSaved = true;
85  } catch (\Magento\Framework\Exception\AlreadyExistsException $e) {
86  }
87  } while (!$isDuplicateSaved);
88  $this->getOptionRepository()->duplicate($product, $duplicate);
89  $product->getResource()->duplicate(
90  $product->getData($metadata->getLinkField()),
91  $duplicate->getData($metadata->getLinkField())
92  );
93  return $duplicate;
94  }
95 
100  private function getOptionRepository()
101  {
102  if (null === $this->optionRepository) {
103  $this->optionRepository = \Magento\Framework\App\ObjectManager::getInstance()
104  ->get(\Magento\Catalog\Model\Product\Option\Repository::class);
105  }
107  }
108 
113  private function getMetadataPool()
114  {
115  if (null === $this->metadataPool) {
117  ->get(\Magento\Framework\EntityManager\MetadataPool::class);
118  }
119  return $this->metadataPool;
120  }
121 
128  private function removeStockItem(array $productData)
129  {
132  if (null !== $extensionAttributes->getStockItem()) {
133  $extensionAttributes->setData('stock_item', null);
134  }
135  }
136  return $productData;
137  }
138 }
$productData
__construct(CopyConstructorInterface $copyConstructor, \Magento\Catalog\Model\ProductFactory $productFactory)
Definition: Copier.php:38