Skip to content

Commit faec06f

Browse files
author
Oleksii Korshenko
authored
MAGETWO-87123: #42 - Dynamically fill the image keys #94
2 parents 78e17be + 51f6dd6 commit faec06f

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
@@ -7,6 +7,7 @@
77

88
use Magento\Catalog\Model\Config as CatalogConfig;
99
use Magento\Catalog\Model\Product\Visibility;
10+
use Magento\CatalogImportExport\Model\Import\Product\ImageTypeProcessor;
1011
use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface;
1112
use Magento\Framework\App\Filesystem\DirectoryList;
1213
use Magento\Framework\Filesystem;
@@ -424,7 +425,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
424425
*
425426
* @var string[]
426427
*/
427-
protected $_imagesArrayKeys = ['image', 'small_image', 'thumbnail', 'swatch_image', '_media_image'];
428+
protected $_imagesArrayKeys = [];
428429

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

702+
/**
703+
* @var ImageTypeProcessor
704+
*/
705+
private $imageTypeProcessor;
706+
701707
/**
702708
* @param \Magento\Framework\Json\Helper\Data $jsonHelper
703709
* @param \Magento\ImportExport\Helper\Data $importExportData
@@ -737,6 +743,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
737743
* @param array $data
738744
* @param array $dateAttrCodes
739745
* @param CatalogConfig $catalogConfig
746+
* @param ImageTypeProcessor $imageTypeProcessor
740747
* @throws \Magento\Framework\Exception\LocalizedException
741748
*
742749
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -780,7 +787,8 @@ public function __construct(
780787
\Magento\Catalog\Model\Product\Url $productUrl,
781788
array $data = [],
782789
array $dateAttrCodes = [],
783-
CatalogConfig $catalogConfig = null
790+
CatalogConfig $catalogConfig = null,
791+
ImageTypeProcessor $imageTypeProcessor = null
784792
) {
785793
$this->_eventManager = $eventManager;
786794
$this->stockRegistry = $stockRegistry;
@@ -813,6 +821,8 @@ public function __construct(
813821
$this->dateAttrCodes = array_merge($this->dateAttrCodes, $dateAttrCodes);
814822
$this->catalogConfig = $catalogConfig ?: \Magento\Framework\App\ObjectManager::getInstance()
815823
->get(CatalogConfig::class);
824+
$this->imageTypeProcessor = $imageTypeProcessor ?: \Magento\Framework\App\ObjectManager::getInstance()
825+
->get(ImageTypeProcessor::class);
816826

817827
parent::__construct(
818828
$jsonHelper,
@@ -832,7 +842,8 @@ public function __construct(
832842

833843
$this->_initAttributeSets()
834844
->_initTypeModels()
835-
->_initSkus();
845+
->_initSkus()
846+
->initImagesArrayKeys();
836847
$this->validator->init($this);
837848
}
838849

@@ -1075,6 +1086,17 @@ protected function _initSkus()
10751086
return $this;
10761087
}
10771088

1089+
/**
1090+
* Initialize image array keys.
1091+
*
1092+
* @return $this
1093+
*/
1094+
private function initImagesArrayKeys()
1095+
{
1096+
$this->_imagesArrayKeys = $this->imageTypeProcessor->getImageTypes();
1097+
return $this;
1098+
}
1099+
10781100
/**
10791101
* Initialize product type models.
10801102
*
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\ImportExport\Model\Import;
1011

@@ -158,6 +159,9 @@ class ProductTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractI
158159
/** @var \Magento\Catalog\Model\Product\Url|\PHPUnit_Framework_MockObject_MockObject*/
159160
protected $productUrl;
160161

162+
/** @var ImageTypeProcessor|\PHPUnit_Framework_MockObject_MockObject */
163+
protected $imageTypeProcessor;
164+
161165
/**
162166
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
163167
*/
@@ -325,11 +329,16 @@ protected function setUp()
325329

326330
$this->data = [];
327331

332+
$this->imageTypeProcessor = $this->getMockBuilder(ImageTypeProcessor::class)
333+
->disableOriginalConstructor()
334+
->getMock();
335+
328336
$this->_objectConstructor()
329337
->_parentObjectConstructor()
330338
->_initAttributeSets()
331339
->_initTypeModels()
332-
->_initSkus();
340+
->_initSkus()
341+
->_initImagesArrayKeys();
333342

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

@@ -372,7 +381,8 @@ protected function setUp()
372381
'taxClassProcessor' => $this->taxClassProcessor,
373382
'scopeConfig' => $this->scopeConfig,
374383
'productUrl' => $this->productUrl,
375-
'data' => $this->data
384+
'data' => $this->data,
385+
'imageTypeProcessor' => $this->imageTypeProcessor
376386
]
377387
);
378388
$reflection = new \ReflectionClass(\Magento\CatalogImportExport\Model\Import\Product::class);
@@ -495,6 +505,14 @@ protected function _initSkus()
495505
return $this;
496506
}
497507

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

0 commit comments

Comments
 (0)