Skip to content

Commit

Permalink
GRKAS1/KSVA1: Fix duplicate images
Browse files Browse the repository at this point in the history
  • Loading branch information
dxops committed Feb 12, 2020
1 parent 27feb43 commit eaa04bc
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 130 deletions.
4 changes: 2 additions & 2 deletions ImportExport/DataConverter/ProductImageDataConverter.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ class ProductImageDataConverter extends BaseProductImageDataConverter
*/
public function convertToImportFormat(array $importedRecord, $skipNullValues = true)
{
$importedRecord['types'][ProductImageType::TYPE_MAIN] = true;
$importedRecord['types'][ProductImageType::TYPE_LISTING] = true;
$importedRecord['types'][ProductImageType::TYPE_MAIN] = false;
$importedRecord['types'][ProductImageType::TYPE_LISTING] = false;
$importedRecord['types'][ProductImageType::TYPE_ADDITIONAL] = true;

return parent::convertToImportFormat($importedRecord, $skipNullValues);
Expand Down
104 changes: 86 additions & 18 deletions ImportExport/Processor/ProductImageImportProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,102 @@
namespace Oro\Bundle\AkeneoBundle\ImportExport\Processor;

use Oro\Bundle\IntegrationBundle\ImportExport\Processor\StepExecutionAwareImportProcessor;
use Oro\Bundle\ProductBundle\Entity\Product;
use Oro\Bundle\ProductBundle\Entity\ProductImage;
use Oro\Bundle\ProductBundle\Entity\ProductImageType;

class ProductImageImportProcessor extends StepExecutionAwareImportProcessor
{
/**
* {@inheritdoc}
*/
public function process($item)
public function process($items)
{
if ($this->dataConverter) {
$item = $this->dataConverter->convertToImportFormat($item, false);
$images = [];
$product = null;
foreach ($items as $image) {
if ($this->dataConverter) {
$image = $this->dataConverter->convertToImportFormat($image, false);
}

/** @var ProductImage $object */
$object = $this->serializer->deserialize(
$image,
$this->getEntityName(),
null,
array_merge(
$this->context->getConfiguration(),
[
'entityName' => $this->getEntityName(),
]
)
);

if ($this->strategy) {
$object = $this->strategy->process($object);
if ($object) {
$product = $object->getProduct();
$images[$object->getImage()->getOriginalFilename()] = $object;
}
}
}

if (!$product) {
return null;
}

return $this->mergeImages($product, $images);
}

/**
* @param ProductImage[] $images
*/
private function mergeImages(Product $product, array $images): Product
{
$hasMain = false;
$hasListing = false;
$image = null;

foreach ($product->getImages() as $image) {
if (!$image->getImage()) {
$product->removeImage($image);

continue;
}

$filename = $image->getImage()->getOriginalFilename();
if (!in_array($filename, array_keys($images))) {
$product->removeImage($image);

continue;
}

$hasMain = $hasMain || $image->hasType(ProductImageType::TYPE_MAIN);
$hasListing = $hasListing || $image->hasType(ProductImageType::TYPE_LISTING);

unset($images[$filename]);
}

foreach ($images as $image) {
if (!$image->getImage()) {
continue;
}

$product->addImage($image);
}

if (!$hasMain) {
if ($product->getImages()->last()) {
$product->getImages()->last()->addType(ProductImageType::TYPE_MAIN);
}
}

$object = $this->serializer->deserialize(
$item,
$this->getEntityName(),
null,
array_merge(
$this->context->getConfiguration(),
[
'entityName' => $this->getEntityName(),
]
)
);

if ($this->strategy) {
$object = $this->strategy->process($object);
if (!$hasListing) {
if ($product->getImages()->last()) {
$product->getImages()->last()->addType(ProductImageType::TYPE_LISTING);
}
}

return $object ?: null;
return $product;
}
}
27 changes: 13 additions & 14 deletions ImportExport/Reader/ProductImageReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,13 @@ protected function initializeFromContext(ContextInterface $context)
continue;
}

$images[] = [
'SKU' => $item['identifier'] ?? $item['code'],
'Name' => basename($value['data']),
];
$identifier = $item['identifier'] ?? $item['code'];
$basename = basename($value['data']);
$images[$identifier][$basename] = ['SKU' => $identifier, 'Name' => $basename];

if ($this->getTransport()->isAkeneoMergeImageToParent() && !empty($item['parent'])) {
$images[] = [
'SKU' => $item['parent'],
'Name' => basename($value['data']),
];
$identifier = $item['parent'];
$images[$identifier][$basename] = ['SKU' => $identifier, 'Name' => $basename];
}
}
}
Expand Down Expand Up @@ -109,13 +106,15 @@ private function getTransport(): ?AkeneoSettings
protected function processImagesDownload(array $items, ContextInterface $context)
{
foreach ($items as $item) {
foreach ($item['values'] as $values) {
foreach ($values as $value) {
if ('pim_catalog_image' !== $value['type'] || empty($value['data'])) {
continue;
}
foreach ($item['values'] as $code => $values) {
if (empty($this->attributesImageFilter) || in_array($code, $this->attributesImageFilter)) {
foreach ($values as $value) {
if ('pim_catalog_image' !== $value['type'] || empty($value['data'])) {
continue;
}

$this->getAkeneoTransport($context)->downloadAndSaveMediaFile('product_images', $value['data']);
$this->getAkeneoTransport($context)->downloadAndSaveMediaFile('product_images', $value['data']);
}
}
}
}
Expand Down
38 changes: 1 addition & 37 deletions ImportExport/Strategy/ProductImageImportStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,63 +2,27 @@

namespace Oro\Bundle\AkeneoBundle\ImportExport\Strategy;

use Oro\Bundle\BatchBundle\Item\Support\ClosableInterface;
use Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy;
use Oro\Bundle\ProductBundle\Entity\ProductImage;
use Oro\Bundle\ProductBundle\Entity\ProductImageType;

/**
* Strategy to import product images.
*/
class ProductImageImportStrategy extends ConfigurableAddOrReplaceStrategy implements ClosableInterface
class ProductImageImportStrategy extends ConfigurableAddOrReplaceStrategy
{
use ImportStrategyAwareHelperTrait;

/**
* @var array
*/
protected $processedSkus = [];

/**
* {@inheritdoc}
*/
public function close()
{
$this->processedSkus = [];
}

/**
* @param ProductImage $entity
*
* @return object
*/
protected function beforeProcessEntity($entity)
{
$sku = $entity->getProduct()->getSku();

if (!$entity->getImage()) {
return null;
}

$processedSkus = $this->processedSkus[$sku] ?? 0;
$processedSkus++;
if ($processedSkus > 1) {
$this->removeImageTypes($entity);
}
$this->processedSkus[$sku] = $processedSkus;

return parent::beforeProcessEntity($entity);
}

/**
* Denormalizer sets wrong keys so ProductImage::removeType doesn't work.
*/
private function removeImageTypes(ProductImage $entity)
{
foreach ($entity->getTypes() as $key => $type) {
if (in_array($type->getType(), [ProductImageType::TYPE_MAIN, ProductImageType::TYPE_LISTING])) {
unset($entity->getTypes()[$key]);
}
}
}
}
54 changes: 0 additions & 54 deletions ImportExport/Writer/ProductImageWriter.php

This file was deleted.

6 changes: 1 addition & 5 deletions Resources/config/importexport.yml
Original file line number Diff line number Diff line change
Expand Up @@ -253,10 +253,6 @@ services:
calls:
- [setImportStrategyHelper, ['@oro_akeneo.strategy.import.helper']]

oro_akeneo.importexport.writer.product_image:
class: 'Oro\Bundle\AkeneoBundle\ImportExport\Writer\ProductImageWriter'
parent: oro_integration.writer.persistent_batch_writer

oro_akeneo.importexport.writer.attribute:
class: '%oro_akeneo.importexport.writer.attribute.class%'
parent: oro_entity_config.importexport.writer.attribute
Expand All @@ -278,7 +274,7 @@ services:
oro_akeneo.importexport.writer.cumulative.product_image:
class: 'Oro\Bundle\AkeneoBundle\ImportExport\Writer\CumulativeWriter'
arguments:
- '@oro_akeneo.importexport.writer.product_image'
- '@oro_integration.writer.persistent_batch_writer'
- '@oro_platform.optional_listeners.manager'
- '@doctrine'
- '@oro_entity_config.config_manager'
Expand Down

0 comments on commit eaa04bc

Please sign in to comment.