Skip to content

Commit 851ed5c

Browse files
author
Alexey Yakimovich
committed
MAGETWO-87974: Can't hide product images via hide_from_product_page attribute during import
- Added possipility to show/hide existing images via import; - Added new field to export: show_on_product_page;
1 parent 419fd4b commit 851ed5c

File tree

3 files changed

+107
-17
lines changed

3 files changed

+107
-17
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,7 @@ protected function setHeaderColumns($customOptionsData, $stockItemRows)
734734
'additional_images',
735735
'additional_image_labels',
736736
'hide_from_product_page',
737+
'show_on_product_page',
737738
'custom_options'
738739
]
739740
);
@@ -1198,13 +1199,16 @@ private function appendMultirowData(&$dataRow, $multiRawData)
11981199
$additionalImages = [];
11991200
$additionalImageLabels = [];
12001201
$additionalImageIsDisabled = [];
1202+
$additionalImageIsEnabled = [];
12011203
foreach ($multiRawData['mediaGalery'][$productLinkId] as $mediaItem) {
12021204
if ((int)$mediaItem['_media_store_id'] === Store::DEFAULT_STORE_ID) {
12031205
$additionalImages[] = $mediaItem['_media_image'];
12041206
$additionalImageLabels[] = $mediaItem['_media_label'];
12051207

12061208
if ($mediaItem['_media_is_disabled'] == true) {
12071209
$additionalImageIsDisabled[] = $mediaItem['_media_image'];
1210+
} else {
1211+
$additionalImageIsEnabled[] = $mediaItem['_media_image'];
12081212
}
12091213
}
12101214
}
@@ -1214,6 +1218,8 @@ private function appendMultirowData(&$dataRow, $multiRawData)
12141218
implode(Import::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageLabels);
12151219
$dataRow['hide_from_product_page'] =
12161220
implode(Import::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageIsDisabled);
1221+
$dataRow['show_on_product_page'] =
1222+
implode(Import::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageIsEnabled);
12171223
$multiRawData['mediaGalery'][$productLinkId] = [];
12181224
}
12191225
foreach ($this->_linkTypeProvider->getLinkTypes() as $linkTypeName => $linkId) {
@@ -1241,11 +1247,14 @@ private function appendMultirowData(&$dataRow, $multiRawData)
12411247
$dataRow = $this->rowCustomizer->addData($dataRow, $productId);
12421248
} else {
12431249
$additionalImageIsDisabled = [];
1250+
$additionalImageIsEnabled = [];
12441251
if (!empty($multiRawData['mediaGalery'][$productLinkId])) {
12451252
foreach ($multiRawData['mediaGalery'][$productLinkId] as $mediaItem) {
12461253
if ((int)$mediaItem['_media_store_id'] === $storeId) {
12471254
if ($mediaItem['_media_is_disabled'] == true) {
12481255
$additionalImageIsDisabled[] = $mediaItem['_media_image'];
1256+
} else {
1257+
$additionalImageIsEnabled[] = $mediaItem['_media_image'];
12491258
}
12501259
}
12511260
}
@@ -1254,6 +1263,10 @@ private function appendMultirowData(&$dataRow, $multiRawData)
12541263
$dataRow['hide_from_product_page'] =
12551264
implode(Import::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageIsDisabled);
12561265
}
1266+
if ($additionalImageIsEnabled) {
1267+
$dataRow['show_on_product_page'] =
1268+
implode(Import::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageIsEnabled);
1269+
}
12571270
}
12581271

12591272
if (!empty($this->collectedMultiselectsData[$storeId][$productId])) {

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

Lines changed: 65 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
312312
self::COL_MEDIA_IMAGE => 'additional_images',
313313
'_media_image_label' => 'additional_image_labels',
314314
'_media_is_disabled' => 'hide_from_product_page',
315+
'_media_is_enabled' => 'show_on_product_page',
315316
Product::COL_STORE => 'store_view_code',
316317
Product::COL_ATTR_SET => 'attribute_set_code',
317318
Product::COL_TYPE => 'product_type',
@@ -1599,6 +1600,7 @@ protected function _saveProducts()
15991600
$tierPrices = [];
16001601
$mediaGallery = [];
16011602
$labelsForUpdate = [];
1603+
$imagesForChangeVisibility = [];
16021604
$uploadedImages = [];
16031605
$previousType = null;
16041606
$prevAttributeSet = null;
@@ -1718,21 +1720,18 @@ protected function _saveProducts()
17181720
}
17191721

17201722
// 5. Media gallery phase
1721-
$disabledImages = [];
17221723
list($rowImages, $rowLabels) = $this->getImagesFromRow($rowData);
17231724
$storeId = !empty($rowData[self::COL_STORE])
17241725
? $this->getStoreIdByCode($rowData[self::COL_STORE])
17251726
: Store::DEFAULT_STORE_ID;
1726-
if (isset($rowData['_media_is_disabled']) && strlen(trim($rowData['_media_is_disabled']))) {
1727-
$disabledImages = array_flip(
1728-
explode($this->getMultipleValueSeparator(), $rowData['_media_is_disabled'])
1729-
);
1730-
if (empty($rowImages)) {
1731-
foreach (array_keys($disabledImages) as $disabledImage) {
1732-
$rowImages[self::COL_MEDIA_IMAGE][] = $disabledImage;
1733-
}
1727+
$imageHiddenStates = $this->getImagesHiddenStates($rowData);
1728+
foreach (array_keys($imageHiddenStates) as $image) {
1729+
if (array_key_exists($image, $existingImages[$rowSku])) {
1730+
$rowImages[self::COL_MEDIA_IMAGE][] = $image;
1731+
$uploadedImages[$image] = $image;
17341732
}
17351733
}
1734+
17361735
$rowData[self::COL_MEDIA_IMAGE] = [];
17371736

17381737
/*
@@ -1766,13 +1765,23 @@ protected function _saveProducts()
17661765

17671766
if ($uploadedFile && !isset($mediaGallery[$storeId][$rowSku][$uploadedFile])) {
17681767
if (isset($existingImages[$rowSku][$uploadedFile])) {
1768+
$currentFileData = $existingImages[$rowSku][$uploadedFile];
17691769
if (isset($rowLabels[$column][$columnImageKey])
17701770
&& $rowLabels[$column][$columnImageKey] !=
1771-
$existingImages[$rowSku][$uploadedFile]['label']
1771+
$currentFileData['label']
17721772
) {
17731773
$labelsForUpdate[] = [
17741774
'label' => $rowLabels[$column][$columnImageKey],
1775-
'imageData' => $existingImages[$rowSku][$uploadedFile]
1775+
'imageData' => $currentFileData
1776+
];
1777+
}
1778+
1779+
if (array_key_exists($uploadedFile, $imageHiddenStates)
1780+
&& $currentFileData['disabled'] != $imageHiddenStates[$uploadedFile]
1781+
) {
1782+
$imagesForChangeVisibility[] = [
1783+
'disabled' => $imageHiddenStates[$uploadedFile],
1784+
'imageData' => $currentFileData
17761785
];
17771786
}
17781787
} else {
@@ -1785,7 +1794,8 @@ protected function _saveProducts()
17851794
? $rowLabels[$column][$columnImageKey]
17861795
: '',
17871796
'position' => ++$position,
1788-
'disabled' => isset($disabledImages[$columnImage]) ? '1' : '0',
1797+
'disabled' => isset($imageHiddenStates[$columnImage])
1798+
? $imageHiddenStates[$columnImage] : '0',
17891799
'value' => $uploadedFile,
17901800
];
17911801
}
@@ -1905,6 +1915,8 @@ protected function _saveProducts()
19051915
$mediaGallery
19061916
)->_saveProductAttributes(
19071917
$attributes
1918+
)->updateMediaGalleryVisibility(
1919+
$imagesForChangeVisibility
19081920
)->updateMediaGalleryLabels(
19091921
$labelsForUpdate
19101922
);
@@ -1918,6 +1930,32 @@ protected function _saveProducts()
19181930
return $this;
19191931
}
19201932

1933+
/**
1934+
* Prepare array with image states (visible or hidden from product page)
1935+
* @param array $rowData
1936+
* @return array
1937+
*/
1938+
private function getImagesHiddenStates($rowData)
1939+
{
1940+
$statesArray = [];
1941+
$mappingArray = [
1942+
'_media_is_disabled' => '1',
1943+
'_media_is_enabled' => '0'
1944+
];
1945+
1946+
foreach ($mappingArray as $key => $value) {
1947+
if (isset($rowData[$key]) && strlen(trim($rowData[$key]))) {
1948+
$items = explode($this->getMultipleValueSeparator(), $rowData[$key]);
1949+
1950+
foreach ($items as $item) {
1951+
$statesArray[$item] = $value;
1952+
}
1953+
}
1954+
}
1955+
1956+
return $statesArray;
1957+
}
1958+
19211959
/**
19221960
* @param array $rowData
19231961
* @return array
@@ -2835,6 +2873,21 @@ private function updateMediaGalleryLabels(array $labels)
28352873
}
28362874
}
28372875

2876+
/**
2877+
* Update 'disabled' field for media gallery entity
2878+
*
2879+
* @param array $images
2880+
* @return $this
2881+
*/
2882+
private function updateMediaGalleryVisibility(array $images)
2883+
{
2884+
if (!empty($images)) {
2885+
$this->mediaProcessor->updateMediaGalleryVisibility($images);
2886+
}
2887+
2888+
return $this;
2889+
}
2890+
28382891
/**
28392892
* Parse values from multiple attributes fields
28402893
*

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

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,37 @@ public function saveMediaGallery(array $mediaGalleryData)
152152
* @return void
153153
*/
154154
public function updateMediaGalleryLabels(array $labels)
155+
{
156+
$this->updateMediaGalleryField($labels, 'label');
157+
}
158+
159+
/**
160+
* Update 'disabled' field for media gallery entity
161+
*
162+
* @param array $labels
163+
* @return void
164+
*/
165+
public function updateMediaGalleryVisibility(array $images)
166+
{
167+
$this->updateMediaGalleryField($images, 'disabled');
168+
}
169+
170+
/**
171+
* Update value for requested field in media gallery entities
172+
*
173+
* @param array $data
174+
* @param string $field
175+
* @return void
176+
*/
177+
private function updateMediaGalleryField(array $data, $field)
155178
{
156179
$insertData = [];
157-
foreach ($labels as $label) {
158-
$imageData = $label['imageData'];
180+
foreach ($data as $datum) {
181+
$imageData = $datum['imageData'];
159182

160-
if ($imageData['label'] === null) {
183+
if ($imageData[$field] === null) {
161184
$insertData[] = [
162-
'label' => $label['label'],
185+
$field => $datum[$field],
163186
$this->getProductEntityLinkField() => $imageData[$this->getProductEntityLinkField()],
164187
'value_id' => $imageData['value_id'],
165188
'store_id' => Store::DEFAULT_STORE_ID,
@@ -168,7 +191,7 @@ public function updateMediaGalleryLabels(array $labels)
168191
$this->connection->update(
169192
$this->mediaGalleryValueTableName,
170193
[
171-
'label' => $label['label'],
194+
$field => $datum[$field],
172195
],
173196
[
174197
$this->getProductEntityLinkField() . ' = ?' => $imageData[$this->getProductEntityLinkField()],
@@ -224,6 +247,7 @@ public function getExistingImages(array $bunch)
224247
),
225248
[
226249
'label' => 'mgv.label',
250+
'disabled' => 'mgv.disabled',
227251
]
228252
)->joinInner(
229253
['pe' => $this->productEntityTableName],

0 commit comments

Comments
 (0)