mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
280 lines
11 KiB
PHP
280 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
namespace Magento\ConfigurableProduct\Model;
|
|
|
|
use Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory;
|
|
use Magento\Catalog\Model\ProductRepository;
|
|
use Magento\Framework\Exception\InputException;
|
|
use Magento\Framework\Exception\NoSuchEntityException;
|
|
use Magento\Framework\Exception\StateException;
|
|
|
|
/**
|
|
* Configurable product link management.
|
|
*
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class LinkManagement implements \Magento\ConfigurableProduct\Api\LinkManagementInterface
|
|
{
|
|
/**
|
|
* @var \Magento\Catalog\Api\ProductRepositoryInterface
|
|
*/
|
|
private $productRepository;
|
|
|
|
/**
|
|
* @var \Magento\Catalog\Api\Data\ProductInterfaceFactory
|
|
*/
|
|
private $productFactory;
|
|
|
|
/**
|
|
* @var \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable
|
|
*/
|
|
private $configurableType;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Api\DataObjectHelper
|
|
*/
|
|
private $dataObjectHelper;
|
|
|
|
/**
|
|
* @var \Magento\ConfigurableProduct\Helper\Product\Options\Factory;
|
|
*/
|
|
private $optionsFactory;
|
|
|
|
/**
|
|
* @var \Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory
|
|
*/
|
|
private $attributeFactory;
|
|
|
|
/**
|
|
* @var ProductRepository|mixed
|
|
*/
|
|
private \Magento\Catalog\Model\ProductRepository $mediaGallery;
|
|
|
|
/**
|
|
* @var ProductAttributeMediaGalleryEntryInterfaceFactory|mixed
|
|
*/
|
|
private \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory $myModelFactory;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
|
|
* @param \Magento\Catalog\Api\Data\ProductInterfaceFactory $productFactory
|
|
* @param \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable $configurableType
|
|
* @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
|
|
* @param \Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory $attributeFactory
|
|
* @param \Magento\Catalog\Model\ProductRepository $mediaGalleryProcessor
|
|
* @param \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory $myModelFactory
|
|
* @param \Magento\ConfigurableProduct\Helper\Product\Options\Factory $optionsFactory
|
|
*/
|
|
public function __construct(
|
|
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
|
|
\Magento\Catalog\Api\Data\ProductInterfaceFactory $productFactory,
|
|
\Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable $configurableType,
|
|
\Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
|
|
\Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory $attributeFactory = null,
|
|
\Magento\Catalog\Model\ProductRepository $mediaGalleryProcessor = null,
|
|
\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory $myModelFactory = null,
|
|
\Magento\ConfigurableProduct\Helper\Product\Options\Factory $optionsFactory = null
|
|
) {
|
|
$this->productRepository = $productRepository;
|
|
$this->productFactory = $productFactory;
|
|
$this->configurableType = $configurableType;
|
|
$this->dataObjectHelper = $dataObjectHelper;
|
|
$this->attributeFactory = $attributeFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
|
|
->get(\Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory::class);
|
|
$this->mediaGallery = $mediaGalleryProcessor ?: \Magento\Framework\App\ObjectManager::getInstance()
|
|
->get(\Magento\Catalog\Model\ProductRepository::class);
|
|
$this->myModelFactory = $myModelFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
|
|
->get(\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory::class);
|
|
$this->optionsFactory = $optionsFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
|
|
->get(\Magento\ConfigurableProduct\Helper\Product\Options\Factory::class);
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function getChildren($sku)
|
|
{
|
|
/** @var \Magento\Catalog\Model\Product $product */
|
|
$product = $this->productRepository->get($sku);
|
|
if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
|
|
return [];
|
|
}
|
|
/** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable $productTypeInstance */
|
|
$productTypeInstance = $product->getTypeInstance();
|
|
$productTypeInstance->setStoreFilter($product->getStoreId(), $product);
|
|
$childrenList = [];
|
|
/** @var \Magento\Catalog\Model\Product $child */
|
|
foreach ($productTypeInstance->getUsedProducts($product) as $child) {
|
|
$attributes = [];
|
|
foreach ($child->getAttributes() as $attribute) {
|
|
$attrCode = $attribute->getAttributeCode();
|
|
$value = $child->getDataUsingMethod($attrCode) ?: $child->getData($attrCode);
|
|
if (null !== $value) {
|
|
$attributes[$attrCode] = $value;
|
|
}
|
|
}
|
|
$images= (array)$child->getMediaGallery('images');
|
|
$attributes['store_id'] = $child->getStoreId();
|
|
$attributes['media_gallery_entries'] = $this->getMediaEntries($images);
|
|
/** @var \Magento\Catalog\Api\Data\ProductInterface $productDataObject */
|
|
$productDataObject = $this->productFactory->create();
|
|
$this->dataObjectHelper->populateWithArray(
|
|
$productDataObject,
|
|
$attributes,
|
|
\Magento\Catalog\Api\Data\ProductInterface::class
|
|
);
|
|
$childrenList[] = $productDataObject;
|
|
}
|
|
return $childrenList;
|
|
}
|
|
|
|
/**
|
|
* Get media entries
|
|
*
|
|
* @param array $images
|
|
* @return array
|
|
*/
|
|
public function getMediaEntries(array $images): array
|
|
{
|
|
$media = $this->myModelFactory->create();
|
|
$mediaGalleryEntries=[];
|
|
foreach ($images as $image) {
|
|
$media->setId($image["value_id"]);
|
|
$media->setMediaType($image["media_type"]);
|
|
$media->setLabel($image["label"]);
|
|
$media->setPosition($image["position"]);
|
|
$media->setDisabled($image["disabled"]);
|
|
$media->setFile($image["file"]);
|
|
$mediaGalleryEntries[]=$media->getData();
|
|
}
|
|
return $mediaGalleryEntries;
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
* @throws InputException
|
|
* @throws NoSuchEntityException
|
|
* @throws StateException
|
|
* @throws \Magento\Framework\Exception\CouldNotSaveException
|
|
*/
|
|
public function addChild($sku, $childSku)
|
|
{
|
|
$product = $this->productRepository->get($sku, true);
|
|
$child = $this->productRepository->get($childSku);
|
|
|
|
$childrenIds = array_values($this->configurableType->getChildrenIds($product->getId())[0]);
|
|
if (in_array($child->getId(), $childrenIds)) {
|
|
throw new StateException(__('The product is already attached.'));
|
|
}
|
|
|
|
$configurableProductOptions = $product->getExtensionAttributes()->getConfigurableProductOptions();
|
|
if (empty($configurableProductOptions)) {
|
|
throw new StateException(__("The parent product doesn't have configurable product options."));
|
|
}
|
|
|
|
$attributeData = [];
|
|
foreach ($configurableProductOptions as $configurableProductOption) {
|
|
$attributeCode = $configurableProductOption->getProductAttribute()->getAttributeCode();
|
|
if (!$child->getData($attributeCode)) {
|
|
throw new StateException(
|
|
__(
|
|
'The child product doesn\'t have the "%1" attribute value. Verify the value and try again.',
|
|
$attributeCode
|
|
)
|
|
);
|
|
}
|
|
$attributeData[$configurableProductOption->getAttributeId()] = [
|
|
'position' => $configurableProductOption->getPosition()
|
|
];
|
|
}
|
|
$configurableOptionData = $this->getConfigurableAttributesData($attributeData);
|
|
|
|
/** @var \Magento\ConfigurableProduct\Helper\Product\Options\Factory $optionFactory */
|
|
$optionFactory = $this->optionsFactory;
|
|
$options = $optionFactory->create($configurableOptionData);
|
|
$childrenIds[] = $child->getId();
|
|
$product->getExtensionAttributes()->setConfigurableProductOptions($options);
|
|
$product->getExtensionAttributes()->setConfigurableProductLinks($childrenIds);
|
|
$this->productRepository->save($product);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
* @throws InputException
|
|
* @throws NoSuchEntityException
|
|
* @throws StateException
|
|
* @throws \Magento\Framework\Exception\CouldNotSaveException
|
|
*/
|
|
public function removeChild($sku, $childSku)
|
|
{
|
|
$product = $this->productRepository->get($sku);
|
|
|
|
if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
|
|
throw new InputException(
|
|
__('The product with the "%1" SKU isn\'t a configurable product.', $sku)
|
|
);
|
|
}
|
|
|
|
$options = $product->getTypeInstance()->getUsedProducts($product);
|
|
$ids = [];
|
|
foreach ($options as $option) {
|
|
if ($option->getSku() == $childSku) {
|
|
continue;
|
|
}
|
|
$ids[] = $option->getId();
|
|
}
|
|
if (count($options) == count($ids)) {
|
|
throw new NoSuchEntityException(
|
|
__("The option that was requested doesn't exist. Verify the entity and try again.")
|
|
);
|
|
}
|
|
$product->getExtensionAttributes()->setConfigurableProductLinks($ids);
|
|
$this->productRepository->save($product);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get Configurable Attribute Data
|
|
*
|
|
* @param int[] $attributeData
|
|
* @return array
|
|
*/
|
|
private function getConfigurableAttributesData($attributeData)
|
|
{
|
|
$configurableAttributesData = [];
|
|
$attributeValues = [];
|
|
$attributes = $this->attributeFactory->create()
|
|
->getCollection()
|
|
->addFieldToFilter('attribute_id', array_keys($attributeData))
|
|
->getItems();
|
|
foreach ($attributes as $attribute) {
|
|
foreach ($attribute->getOptions() as $option) {
|
|
if ($option->getValue()) {
|
|
$attributeValues[] = [
|
|
'label' => $option->getLabel(),
|
|
'attribute_id' => $attribute->getId(),
|
|
'value_index' => $option->getValue(),
|
|
];
|
|
}
|
|
}
|
|
$configurableAttributesData[] =
|
|
[
|
|
'attribute_id' => $attribute->getId(),
|
|
'code' => $attribute->getAttributeCode(),
|
|
'label' => $attribute->getStoreLabel(),
|
|
'position' => $attributeData[$attribute->getId()]['position'],
|
|
'values' => $attributeValues,
|
|
];
|
|
}
|
|
|
|
return $configurableAttributesData;
|
|
}
|
|
}
|