Skip to content

Commit 51f6dd6

Browse files
committed
MAGETWO-87123: #42 - Dynamically fill the image keys #94
- Merge Pull Request magento-engcom/import-export-improvements#94 from VincentMarmiesse/magento2:42-imageskeys - Merged commits: 1. 8d3a237 2. 100e123 3. 36a053f 4. 2bbf5e0 5. c52ad59
2 parents 8e77e2f + c52ad59 commit 51f6dd6

File tree

4 files changed

+154
-5
lines changed

4 files changed

+154
-5
lines changed

app/code/Magento/CatalogImportExport/Model/Import/Product.php

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
namespace Magento\CatalogImportExport\Model\Import;
77

88
use Magento\Catalog\Model\Product\Visibility;
9+
use Magento\CatalogImportExport\Model\Import\Product\ImageTypeProcessor;
910
use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface;
1011
use Magento\Framework\App\Filesystem\DirectoryList;
1112
use Magento\Framework\App\ObjectManager;
@@ -425,7 +426,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
425426
*
426427
* @var string[]
427428
*/
428-
protected $_imagesArrayKeys = ['image', 'small_image', 'thumbnail', 'swatch_image', '_media_image'];
429+
protected $_imagesArrayKeys = [];
429430

430431
/**
431432
* Permanent entity columns.
@@ -699,6 +700,11 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
699700
*/
700701
private $catalogConfig;
701702

703+
/**
704+
* @var ImageTypeProcessor
705+
*/
706+
private $imageTypeProcessor;
707+
702708
/**
703709
* @param \Magento\Framework\Json\Helper\Data $jsonHelper
704710
* @param \Magento\ImportExport\Helper\Data $importExportData
@@ -738,6 +744,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
738744
* @param array $data
739745
* @param array $dateAttrCodes
740746
* @param CatalogConfig $catalogConfig
747+
* @param ImageTypeProcessor $imageTypeProcessor
741748
* @throws \Magento\Framework\Exception\LocalizedException
742749
*
743750
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -781,7 +788,8 @@ public function __construct(
781788
\Magento\Catalog\Model\Product\Url $productUrl,
782789
array $data = [],
783790
array $dateAttrCodes = [],
784-
CatalogConfig $catalogConfig = null
791+
CatalogConfig $catalogConfig = null,
792+
ImageTypeProcessor $imageTypeProcessor = null
785793
) {
786794
$this->_eventManager = $eventManager;
787795
$this->stockRegistry = $stockRegistry;
@@ -814,6 +822,8 @@ public function __construct(
814822
$this->dateAttrCodes = array_merge($this->dateAttrCodes, $dateAttrCodes);
815823
$this->catalogConfig = $catalogConfig ?: \Magento\Framework\App\ObjectManager::getInstance()
816824
->get(CatalogConfig::class);
825+
$this->imageTypeProcessor = $imageTypeProcessor ?: \Magento\Framework\App\ObjectManager::getInstance()
826+
->get(ImageTypeProcessor::class);
817827

818828
parent::__construct(
819829
$jsonHelper,
@@ -833,7 +843,8 @@ public function __construct(
833843

834844
$this->_initAttributeSets()
835845
->_initTypeModels()
836-
->_initSkus();
846+
->_initSkus()
847+
->initImagesArrayKeys();
837848
$this->validator->init($this);
838849
}
839850

@@ -1076,6 +1087,17 @@ protected function _initSkus()
10761087
return $this;
10771088
}
10781089

1090+
/**
1091+
* Initialize image array keys.
1092+
*
1093+
* @return $this
1094+
*/
1095+
private function initImagesArrayKeys()
1096+
{
1097+
$this->_imagesArrayKeys = $this->imageTypeProcessor->getImageTypes();
1098+
return $this;
1099+
}
1100+
10791101
/**
10801102
* Initialize product type models.
10811103
*
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\CatalogImportExport\Model\Import\Product;
7+
8+
use Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModel;
9+
10+
class ImageTypeProcessor
11+
{
12+
/**
13+
* @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModelFactory
14+
*/
15+
private $resourceFactory;
16+
17+
/**
18+
* @param \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModelFactory $resourceFactory
19+
*/
20+
public function __construct(
21+
\Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModelFactory $resourceFactory
22+
) {
23+
$this->resourceFactory = $resourceFactory;
24+
}
25+
26+
/**
27+
* @return array
28+
*/
29+
public function getImageTypes()
30+
{
31+
$imageKeys = [];
32+
/** @var ResourceModel $resource */
33+
$resource = $this->resourceFactory->create();
34+
$connection = $resource->getConnection();
35+
$select = $connection->select();
36+
$select->from(
37+
$resource->getTable('eav_attribute'),
38+
['code' => 'attribute_code']
39+
);
40+
$select->where(
41+
'frontend_input = :frontend_input'
42+
);
43+
$bind = [':frontend_input' => 'media_image'];
44+
45+
$imageKeys = $connection->fetchCol($select, $bind);
46+
$imageKeys[] = '_media_image';
47+
48+
return $imageKeys;
49+
}
50+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\CatalogImportExport\Test\Unit\Model\Import\Product;
7+
8+
use Magento\CatalogImportExport\Model\Import\Product\ImageTypeProcessor;
9+
10+
class ImageTypeProcessorTest extends \PHPUnit\Framework\TestCase
11+
{
12+
public function testGetImageTypes()
13+
{
14+
$resourceFactory = $this->createPartialMock(
15+
\Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModelFactory::class,
16+
['create']
17+
);
18+
19+
$resource = $this->getMockBuilder(\Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModel::class)
20+
->disableOriginalConstructor()
21+
->setMethods(['getTable', 'getConnection'])
22+
->getMock();
23+
$resource->expects($this->once())
24+
->method('getTable')
25+
->with('eav_attribute')
26+
->willReturnArgument(0);
27+
$connection = $this->createMock(\Magento\Framework\DB\Adapter\AdapterInterface::class);
28+
$resource->expects($this->any())
29+
->method('getConnection')
30+
->willReturn($connection);
31+
$resourceFactory->expects($this->once())
32+
->method('create')
33+
->willReturn($resource);
34+
35+
$selectMock = $this->getMockBuilder(\Magento\Framework\DB\Select::class)
36+
->disableOriginalConstructor()
37+
->getMock();
38+
$selectMock->expects($this->once())
39+
->method('from')
40+
->with('eav_attribute', ['code' => 'attribute_code'], null)
41+
->willReturnSelf();
42+
$selectMock->expects($this->once())
43+
->method('where')
44+
->with('frontend_input = :frontend_input')
45+
->willReturnSelf();
46+
$connection->expects($this->any())
47+
->method('fetchCol')
48+
->willReturn(['image', 'small_image', 'thumbnail', 'swatch_image']);
49+
$connection->expects($this->any())
50+
->method('select')
51+
->willReturn($selectMock);
52+
53+
$typeProcessor = new ImageTypeProcessor($resourceFactory);
54+
$this->assertEquals(
55+
['image', 'small_image', 'thumbnail', 'swatch_image', '_media_image'],
56+
$typeProcessor->getImageTypes()
57+
);
58+
}
59+
}

app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\CatalogImportExport\Test\Unit\Model\Import;
77

8+
use Magento\CatalogImportExport\Model\Import\Product\ImageTypeProcessor;
89
use Magento\Framework\App\Filesystem\DirectoryList;
910
use Magento\Framework\Stdlib\DateTime;
1011
use Magento\ImportExport\Model\Import;
@@ -159,6 +160,9 @@ class ProductTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractI
159160
/** @var \Magento\Catalog\Model\Product\Url|\PHPUnit_Framework_MockObject_MockObject*/
160161
protected $productUrl;
161162

163+
/** @var ImageTypeProcessor|\PHPUnit_Framework_MockObject_MockObject */
164+
protected $imageTypeProcessor;
165+
162166
/**
163167
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
164168
*/
@@ -326,11 +330,16 @@ protected function setUp()
326330

327331
$this->data = [];
328332

333+
$this->imageTypeProcessor = $this->getMockBuilder(ImageTypeProcessor::class)
334+
->disableOriginalConstructor()
335+
->getMock();
336+
329337
$this->_objectConstructor()
330338
->_parentObjectConstructor()
331339
->_initAttributeSets()
332340
->_initTypeModels()
333-
->_initSkus();
341+
->_initSkus()
342+
->_initImagesArrayKeys();
334343

335344
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
336345

@@ -373,7 +382,8 @@ protected function setUp()
373382
'taxClassProcessor' => $this->taxClassProcessor,
374383
'scopeConfig' => $this->scopeConfig,
375384
'productUrl' => $this->productUrl,
376-
'data' => $this->data
385+
'data' => $this->data,
386+
'imageTypeProcessor' => $this->imageTypeProcessor
377387
]
378388
);
379389
$reflection = new \ReflectionClass(\Magento\CatalogImportExport\Model\Import\Product::class);
@@ -496,6 +506,14 @@ protected function _initSkus()
496506
return $this;
497507
}
498508

509+
protected function _initImagesArrayKeys()
510+
{
511+
$this->imageTypeProcessor->expects($this->once())->method('getImageTypes')->willReturn(
512+
['image', 'small_image', 'thumbnail', 'swatch_image', '_media_image']
513+
);
514+
return $this;
515+
}
516+
499517
public function testSaveProductAttributes()
500518
{
501519
$testTable = 'test_table';

0 commit comments

Comments
 (0)