15 use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
20 use Magento\Swatches\Model\ResourceModel\Swatch\CollectionFactory as SwatchCollectionFactory;
67 private $metadataPool;
72 private $swatchAttributesProvider;
81 'update_product_preview_image',
82 'use_product_image_for_swatch' 95 private $swatchTypeChecker;
100 private $imageUrlBuilder;
118 Json $serializer =
null,
127 $this->swatchAttributesProvider = $swatchAttributesProvider
129 $this->swatchTypeChecker = $swatchTypeChecker
131 $this->imageUrlBuilder = $urlBuilder;
140 $initialAdditionalData = [];
141 $additionalData = (string)
$attribute->getData(
'additional_data');
142 if (!empty($additionalData)) {
143 $additionalData = $this->serializer->unserialize($additionalData);
144 if (is_array($additionalData)) {
145 $initialAdditionalData = $additionalData;
150 foreach ($this->eavAttributeAdditionalDataKeys as $key) {
152 if (
null !== $dataValue) {
153 $dataToAdd[$key] = $dataValue;
156 $additionalData = array_merge($initialAdditionalData, $dataToAdd);
157 $attribute->setData(
'additional_data', $this->serializer->serialize($additionalData));
170 $isAvailable =
false;
172 $mediaGallery =
$product->getMediaGalleryEntries();
173 foreach ($mediaGallery as $mediaEntry) {
175 $isAvailable = !$mediaEntry->isDisabled();
195 if (!array_diff_assoc($requiredAttributes,
$simpleProduct->getData())
242 ->getMetadata(\
Magento\Catalog\Api\
Data\ProductInterface::class)
244 $parentId = $parentProduct->getData($productLinkedFiled);
248 $configurableAttributes = $this->getAttributesFromConfigurable($parentProduct);
249 $allAttributesArray = [];
250 foreach ($configurableAttributes as
$attribute) {
256 $resultAttributesToFilter = array_merge(
264 if ($variationProduct && $variationProduct->getId()) {
265 return $this->productRepository->getById($variationProduct->getId());
294 [
'pr' => $tableProductRelation],
295 'e.entity_id = pr.child_id' 297 ->where(
'pr.parent_id = ?', $parentId);
318 $mediaGallery =
$product->getMediaGalleryEntries();
319 foreach ($mediaGallery as $mediaEntry) {
320 if ($mediaEntry->isDisabled()) {
324 if (in_array(
'image', $mediaEntry->getTypes(),
true) || !$baseImage) {
325 $baseImage = $mediaEntry->getFile();
328 $gallery[$mediaEntry->getId()] = $this->getAllSizeImages($mediaEntry->getFile());
335 $resultGallery = $this->getAllSizeImages($baseImage);
336 $resultGallery[
'gallery'] = $gallery;
338 return $resultGallery;
345 private function getAllSizeImages($imageFile)
348 'large' => $this->imageUrlBuilder->getUrl($imageFile,
'product_swatch_image_large'),
349 'medium' => $this->imageUrlBuilder->getUrl($imageFile,
'product_swatch_image_medium'),
350 'small' => $this->imageUrlBuilder->getUrl($imageFile,
'product_swatch_image_small')
360 private function getSwatchAttributes(Product
$product)
362 $swatchAttributes = $this->swatchAttributesProvider->provide(
$product);
363 return $swatchAttributes;
372 public function getAttributesFromConfigurable(Product
$product)
379 foreach ($configurableAttributes as $configurableAttribute) {
381 $attribute = $configurableAttribute->getProductAttribute();
397 $swatchAttributes = $this->getSwatchAttributes(
$product);
398 foreach ($swatchAttributes as $swatchAttribute) {
399 $swatchAttribute->setStoreId($this->storeManager->getStore()->getId());
401 foreach ($swatchAttribute->getSource()->getAllOptions(
false) as
$option) {
413 private $swatchesCache = [];
421 public function getSwatchesByOptionsId(array
$optionIds)
423 $swatches = $this->getCachedSwatches(
$optionIds);
426 $swatchOptionIds = array_diff(
$optionIds, array_keys($swatches));
428 $swatchCollection = $this->swatchCollectionFactory->create();
429 $swatchCollection->addFilterByOptionsIds($swatchOptionIds);
432 $fallbackValues = [];
434 foreach ($swatchCollection as
$item) {
436 $swatches[
$item[
'option_id']] =
$item->getData();
439 }
elseif (
$item[
'store_id'] == self::DEFAULT_STORE_ID) {
444 if (!empty($fallbackValues)) {
445 $swatches = $this->addFallbackOptions($fallbackValues, $swatches);
447 $this->setCachedSwatches($swatchOptionIds, $swatches);
450 return array_filter($this->getCachedSwatches(
$optionIds));
459 private function getCachedSwatches(array
$optionIds)
471 private function setCachedSwatches(array
$optionIds, array $swatches)
483 private function addFallbackOptions(array $fallbackValues, array $swatches)
486 foreach ($fallbackValues as
$optionId => $optionsArray) {
491 }
elseif (isset($optionsArray[self::DEFAULT_STORE_ID])) {
507 return !empty($this->getSwatchAttributes(
$product));
518 return $this->swatchTypeChecker->isSwatchAttribute(
$attribute);
529 return $this->swatchTypeChecker->isVisualSwatch(
$attribute);
540 return $this->swatchTypeChecker->isTextSwatch(
$attribute);
551 if (!$this->metadataPool) {
553 ->get(\
Magento\Framework\EntityManager\MetadataPool::class);
555 return $this->metadataPool;
elseif(isset( $params[ 'redirect_parent']))
$eavAttributeAdditionalDataKeys
isVisualSwatch(Attribute $attribute)
$productCollectionFactory
loadFirstVariationWithImage(Product $configurableProduct, array $requiredAttributes)
getSwatchAttributesAsArray(Product $product)
const SWATCH_TYPE_TEXTUAL
__construct(CollectionFactory $productCollectionFactory, ProductRepositoryInterface $productRepository, StoreManagerInterface $storeManager, SwatchCollectionFactory $swatchCollectionFactory, UrlBuilder $urlBuilder, Json $serializer=null, SwatchAttributesProvider $swatchAttributesProvider=null, SwatchAttributeType $swatchTypeChecker=null)
isTextSwatch(Attribute $attribute)
isSwatchAttribute(Attribute $attribute)
loadFirstVariationWithSwatchImage(Product $configurableProduct, array $requiredAttributes)
assembleAdditionalDataEavAttribute(Attribute $attribute)
const SWATCH_INPUT_TYPE_KEY
isProductHasSwatch(Product $product)
loadVariationByFallback(Product $parentProduct, array $attributes)
getProductMediaGallery(ModelProduct $product)