Skip to content

Commit 12cb7fc

Browse files
committed
8255: Export Products action doesn't consider hide_for_product_page value.
1 parent 08f0056 commit 12cb7fc

File tree

6 files changed

+287
-69
lines changed

6 files changed

+287
-69
lines changed

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

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -532,11 +532,12 @@ protected function getMediaGallery(array $productIds)
532532
]
533533
)->joinLeft(
534534
['mgv' => $this->_resourceModel->getTableName('catalog_product_entity_media_gallery_value')],
535-
'(mg.value_id = mgv.value_id AND mgv.store_id = 0)',
535+
'(mg.value_id = mgv.value_id)',
536536
[
537537
'mgv.label',
538538
'mgv.position',
539-
'mgv.disabled'
539+
'mgv.disabled',
540+
'mgv.store_id'
540541
]
541542
)->where(
542543
"mgvte.{$this->getProductEntityLinkField()} IN (?)",
@@ -552,6 +553,7 @@ protected function getMediaGallery(array $productIds)
552553
'_media_label' => $mediaRow['label'],
553554
'_media_position' => $mediaRow['position'],
554555
'_media_is_disabled' => $mediaRow['disabled'],
556+
'_media_store_id' => $mediaRow['store_id'],
555557
];
556558
}
557559

@@ -903,7 +905,7 @@ protected function getExportData()
903905
$dataRow = array_merge($dataRow, $stockItemRows[$productId]);
904906
}
905907
$this->appendMultirowData($dataRow, $multirawData);
906-
if ($dataRow) {
908+
if ($dataRow && !$this->skipRow($dataRow)) {
907909
$exportData[] = $dataRow;
908910
}
909911
}
@@ -931,8 +933,8 @@ protected function loadCollection(): array
931933
foreach ($collection as $itemId => $item) {
932934
$data[$itemId][$storeId] = $item;
933935
}
936+
$collection->clear();
934937
}
935-
$collection->clear();
936938

937939
return $data;
938940
}
@@ -1024,12 +1026,10 @@ protected function collectRawData()
10241026
unset($data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES]);
10251027
}
10261028

1027-
if (!empty($data[$itemId][$storeId]) || $this->hasMultiselectData($item, $storeId)) {
1028-
$attrSetId = $item->getAttributeSetId();
1029-
$data[$itemId][$storeId][self::COL_STORE] = $storeCode;
1030-
$data[$itemId][$storeId][self::COL_ATTR_SET] = $this->_attrSetIdToName[$attrSetId];
1031-
$data[$itemId][$storeId][self::COL_TYPE] = $item->getTypeId();
1032-
}
1029+
$attrSetId = $item->getAttributeSetId();
1030+
$data[$itemId][$storeId][self::COL_STORE] = $storeCode;
1031+
$data[$itemId][$storeId][self::COL_ATTR_SET] = $this->_attrSetIdToName[$attrSetId];
1032+
$data[$itemId][$storeId][self::COL_TYPE] = $item->getTypeId();
10331033
$data[$itemId][$storeId][self::COL_SKU] = htmlspecialchars_decode($item->getSku());
10341034
$data[$itemId][$storeId]['store_id'] = $storeId;
10351035
$data[$itemId][$storeId]['product_id'] = $itemId;
@@ -1162,7 +1162,7 @@ protected function isValidAttributeValue($code, $value)
11621162
* @SuppressWarnings(PHPMD.NPathComplexity)
11631163
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
11641164
*/
1165-
private function appendMultirowData(&$dataRow, &$multiRawData)
1165+
private function appendMultirowData(&$dataRow, $multiRawData)
11661166
{
11671167
$productId = $dataRow['product_id'];
11681168
$productLinkId = $dataRow['product_link_id'];
@@ -1191,11 +1191,13 @@ private function appendMultirowData(&$dataRow, &$multiRawData)
11911191
$additionalImageLabels = [];
11921192
$additionalImageIsDisabled = [];
11931193
foreach ($multiRawData['mediaGalery'][$productLinkId] as $mediaItem) {
1194-
$additionalImages[] = $mediaItem['_media_image'];
1195-
$additionalImageLabels[] = $mediaItem['_media_label'];
1194+
if ((int)$mediaItem['_media_store_id'] === Store::DEFAULT_STORE_ID) {
1195+
$additionalImages[] = $mediaItem['_media_image'];
1196+
$additionalImageLabels[] = $mediaItem['_media_label'];
11961197

1197-
if ($mediaItem['_media_is_disabled'] == true) {
1198-
$additionalImageIsDisabled[] = $mediaItem['_media_image'];
1198+
if ($mediaItem['_media_is_disabled'] == true) {
1199+
$additionalImageIsDisabled[] = $mediaItem['_media_image'];
1200+
}
11991201
}
12001202
}
12011203
$dataRow['additional_images'] =
@@ -1229,6 +1231,21 @@ private function appendMultirowData(&$dataRow, &$multiRawData)
12291231
}
12301232
}
12311233
$dataRow = $this->rowCustomizer->addData($dataRow, $productId);
1234+
} else {
1235+
$additionalImageIsDisabled = [];
1236+
if (!empty($multiRawData['mediaGalery'][$productLinkId])) {
1237+
foreach ($multiRawData['mediaGalery'][$productLinkId] as $mediaItem) {
1238+
if ((int)$mediaItem['_media_store_id'] === $storeId) {
1239+
if ($mediaItem['_media_is_disabled'] == true) {
1240+
$additionalImageIsDisabled[] = $mediaItem['_media_image'];
1241+
}
1242+
}
1243+
}
1244+
}
1245+
if ($additionalImageIsDisabled) {
1246+
$dataRow['hide_from_product_page'] =
1247+
implode(Import::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageIsDisabled);
1248+
}
12321249
}
12331250

12341251
if (!empty($this->collectedMultiselectsData[$storeId][$productId])) {
@@ -1494,4 +1511,25 @@ protected function getProductEntityLinkField()
14941511
}
14951512
return $this->productEntityLinkField;
14961513
}
1514+
1515+
/**
1516+
* Check if row has valuable information to export.
1517+
*
1518+
* @param array $dataRow
1519+
* @return bool
1520+
*/
1521+
private function skipRow(array $dataRow)
1522+
{
1523+
$baseInfo = [
1524+
self::COL_STORE,
1525+
self::COL_ATTR_SET,
1526+
self::COL_TYPE,
1527+
self::COL_SKU,
1528+
'store_id',
1529+
'product_id',
1530+
'product_link_id',
1531+
];
1532+
1533+
return empty(array_diff(array_keys($dataRow), $baseInfo));
1534+
}
14971535
}

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

Lines changed: 129 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Magento\Catalog\Model\Product\Visibility;
99
use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface;
1010
use Magento\Framework\App\Filesystem\DirectoryList;
11-
use Magento\Framework\App\ObjectManager;
1211
use Magento\Framework\Model\ResourceModel\Db\ObjectRelationProcessor;
1312
use Magento\Framework\Model\ResourceModel\Db\TransactionManagerInterface;
1413
use Magento\Framework\Stdlib\DateTime;
@@ -1694,10 +1693,25 @@ protected function _saveProducts()
16941693
// 5. Media gallery phase
16951694
$disabledImages = [];
16961695
list($rowImages, $rowLabels) = $this->getImagesFromRow($rowData);
1696+
$storeId = !empty($rowData[self::COL_STORE])
1697+
? $this->getStoreIdByCode($rowData[self::COL_STORE])
1698+
: Store::DEFAULT_STORE_ID;
16971699
if (isset($rowData['_media_is_disabled'])) {
16981700
$disabledImages = array_flip(
16991701
explode($this->getMultipleValueSeparator(), $rowData['_media_is_disabled'])
17001702
);
1703+
foreach ($disabledImages as $disabledImage => $position) {
1704+
$uploadedFile = $this->uploadMediaFiles($disabledImage, true);
1705+
$uploadedFile = $uploadedFile ?: $this->getSystemFile($disabledImage);
1706+
$mediaGallery[$storeId][$rowSku][$uploadedFile] = [
1707+
'attribute_id' => $this->getMediaGalleryAttributeId(),
1708+
'label' => $rowLabels[self::COL_MEDIA_IMAGE][$position] ?? '',
1709+
'position' => $position,
1710+
'disabled' => 1,
1711+
'value' => $disabledImage,
1712+
'store_id' => $storeId,
1713+
];
1714+
}
17011715
}
17021716
$rowData[self::COL_MEDIA_IMAGE] = [];
17031717

@@ -1730,7 +1744,7 @@ protected function _saveProducts()
17301744
$rowData[$column] = $uploadedFile;
17311745
}
17321746

1733-
if ($uploadedFile && !isset($mediaGallery[$rowSku][$uploadedFile])) {
1747+
if ($uploadedFile && !isset($mediaGallery[$storeId][$rowSku][$uploadedFile])) {
17341748
if (isset($existingImages[$rowSku][$uploadedFile])) {
17351749
if (isset($rowLabels[$column][$columnImageKey])
17361750
&& $rowLabels[$column][$columnImageKey] != $existingImages[$rowSku][$uploadedFile]['label']
@@ -1744,7 +1758,7 @@ protected function _saveProducts()
17441758
if ($column == self::COL_MEDIA_IMAGE) {
17451759
$rowData[$column][] = $uploadedFile;
17461760
}
1747-
$mediaGallery[$rowSku][$uploadedFile] = [
1761+
$mediaGallery[$storeId][$rowSku][$uploadedFile] = [
17481762
'attribute_id' => $this->getMediaGalleryAttributeId(),
17491763
'label' => isset($rowLabels[$column][$columnImageKey]) ? $rowLabels[$column][$columnImageKey] : '',
17501764
'position' => ++$position,
@@ -1756,6 +1770,10 @@ protected function _saveProducts()
17561770
}
17571771
}
17581772

1773+
//Add images to restore "hide from product page" value for specified store and product.
1774+
if (empty($mediaGallery[$storeId][$rowSku])) {
1775+
$mediaGallery[$storeId][$rowSku]['all'] = ['restore' => true];
1776+
}
17591777
// 6. Attributes phase
17601778
$rowStore = (self::SCOPE_STORE == $rowScope)
17611779
? $this->storeResolver->getStoreCodeToId($rowData[self::COL_STORE])
@@ -2075,66 +2093,64 @@ protected function _saveMediaGallery(array $mediaGalleryData)
20752093
return $this;
20762094
}
20772095
$this->initMediaGalleryResources();
2078-
$productIds = [];
20792096
$imageNames = [];
20802097
$multiInsertData = [];
20812098
$valueToProductId = [];
2082-
foreach ($mediaGalleryData as $productSku => $mediaGalleryRows) {
2083-
$productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
2084-
$productIds[] = $productId;
2085-
$insertedGalleryImgs = [];
2086-
foreach ($mediaGalleryRows as $insertValue) {
2087-
if (!in_array($insertValue['value'], $insertedGalleryImgs)) {
2088-
$valueArr = [
2089-
'attribute_id' => $insertValue['attribute_id'],
2090-
'value' => $insertValue['value'],
2091-
];
2092-
$valueToProductId[$insertValue['value']][] = $productId;
2093-
$imageNames[] = $insertValue['value'];
2094-
$multiInsertData[] = $valueArr;
2095-
$insertedGalleryImgs[] = $insertValue['value'];
2099+
$mediaGalleryData = $this->restoreDisableImage($mediaGalleryData);
2100+
foreach (array_keys($mediaGalleryData) as $storeId) {
2101+
foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
2102+
$productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
2103+
2104+
$insertedGalleryImgs = [];
2105+
foreach ($mediaGalleryRows as $insertValue) {
2106+
if (!in_array($insertValue['value'], $insertedGalleryImgs)) {
2107+
$valueArr = [
2108+
'attribute_id' => $insertValue['attribute_id'],
2109+
'value' => $insertValue['value'],
2110+
];
2111+
$valueToProductId[$insertValue['value']][] = $productId;
2112+
$imageNames[] = $insertValue['value'];
2113+
$multiInsertData[] = $valueArr;
2114+
$insertedGalleryImgs[] = $insertValue['value'];
2115+
}
20962116
}
20972117
}
20982118
}
2099-
$oldMediaValues = $this->_connection->fetchAssoc(
2100-
$this->_connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
2101-
->where('value IN (?)', $imageNames)
2102-
);
2103-
$this->_connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData, []);
2104-
$multiInsertData = [];
2119+
$multiInsertData = $this->filterImageInsertData($multiInsertData, $imageNames);
2120+
if ($multiInsertData) {
2121+
$this->_connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
2122+
}
21052123
$newMediaSelect = $this->_connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
21062124
->where('value IN (?)', $imageNames);
2107-
if (array_keys($oldMediaValues)) {
2108-
$newMediaSelect->where('value_id NOT IN (?)', array_keys($oldMediaValues));
2109-
}
2110-
21112125
$dataForSkinnyTable = [];
2126+
$multiInsertData = [];
21122127
$newMediaValues = $this->_connection->fetchAssoc($newMediaSelect);
2113-
foreach ($mediaGalleryData as $productSku => $mediaGalleryRows) {
2114-
foreach ($mediaGalleryRows as $insertValue) {
2115-
foreach ($newMediaValues as $value_id => $values) {
2116-
if ($values['value'] == $insertValue['value']) {
2117-
$insertValue['value_id'] = $value_id;
2118-
$insertValue[$this->getProductEntityLinkField()]
2119-
= array_shift($valueToProductId[$values['value']]);
2120-
unset($newMediaValues[$value_id]);
2121-
break;
2128+
foreach (array_keys($mediaGalleryData) as $storeId) {
2129+
foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
2130+
foreach ($mediaGalleryRows as $insertValue) {
2131+
foreach ($newMediaValues as $value_id => $values) {
2132+
if ($values['value'] == $insertValue['value']) {
2133+
$insertValue['value_id'] = $value_id;
2134+
$insertValue[$this->getProductEntityLinkField()]
2135+
= array_shift($valueToProductId[$values['value']]);
2136+
break;
2137+
}
2138+
}
2139+
if (isset($insertValue['value_id'])) {
2140+
$valueArr = [
2141+
'value_id' => $insertValue['value_id'],
2142+
'store_id' => $storeId,
2143+
$this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
2144+
'label' => $insertValue['label'],
2145+
'position' => $insertValue['position'],
2146+
'disabled' => $insertValue['disabled'],
2147+
];
2148+
$multiInsertData[] = $valueArr;
2149+
$dataForSkinnyTable[] = [
2150+
'value_id' => $insertValue['value_id'],
2151+
$this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
2152+
];
21222153
}
2123-
}
2124-
if (isset($insertValue['value_id'])) {
2125-
$valueArr = [
2126-
'value_id' => $insertValue['value_id'],
2127-
'store_id' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
2128-
$this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
2129-
'label' => $insertValue['label'],
2130-
'position' => $insertValue['position'],
2131-
'disabled' => $insertValue['disabled'],
2132-
];
2133-
$multiInsertData[] = $valueArr;
2134-
$dataForSkinnyTable[] = [
2135-
'value_id' => $insertValue['value_id'],
2136-
$this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
2137-
];
21382154
}
21392155
}
21402156
}
@@ -2155,6 +2171,7 @@ protected function _saveMediaGallery(array $mediaGalleryData)
21552171
$this->_connection->quoteInto('value_id IN (?)', $newMediaValues)
21562172
);
21572173
}
2174+
21582175
return $this;
21592176
}
21602177

@@ -2976,4 +2993,64 @@ private function getExistingSku($sku)
29762993
{
29772994
return $this->_oldSku[strtolower($sku)];
29782995
}
2996+
2997+
/**
2998+
* Set product images 'disable' = 0 for specified store.
2999+
*
3000+
* @param array $mediaGalleryData
3001+
* @return array
3002+
*/
3003+
private function restoreDisableImage(array $mediaGalleryData)
3004+
{
3005+
$restoreData = [];
3006+
foreach (array_keys($mediaGalleryData) as $storeId) {
3007+
foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
3008+
$productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
3009+
$restoreData[] = sprintf(
3010+
'store_id = %s and %s = %s',
3011+
$storeId,
3012+
$this->getProductEntityLinkField(),
3013+
$productId
3014+
);
3015+
if (isset($mediaGalleryRows['all']['restore'])) {
3016+
unset($mediaGalleryData[$storeId][$productSku]);
3017+
}
3018+
}
3019+
}
3020+
3021+
$this->_connection->update(
3022+
$this->mediaGalleryValueTableName,
3023+
['disabled' => 0],
3024+
new \Zend_Db_Expr(implode(' or ', $restoreData))
3025+
);
3026+
3027+
return $mediaGalleryData;
3028+
}
3029+
3030+
/**
3031+
* Remove existed images from insert data.
3032+
*
3033+
* @param array $multiInsertData
3034+
* @param array $imageNames
3035+
* @return array
3036+
*/
3037+
private function filterImageInsertData(array $multiInsertData, array $imageNames)
3038+
{
3039+
//Remove image duplicates for stores.
3040+
$multiInsertData = array_map("unserialize", array_unique(array_map("serialize", $multiInsertData)));
3041+
$oldMediaValues = $this->_connection->fetchAssoc(
3042+
$this->_connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value', 'attribute_id'])
3043+
->where('value IN (?)', $imageNames)
3044+
);
3045+
foreach ($multiInsertData as $key => $data) {
3046+
foreach ($oldMediaValues as $mediaValue) {
3047+
if ($data['value'] == $mediaValue['value'] && $data['attribute_id'] == $mediaValue['attribute_id']) {
3048+
unset($multiInsertData[$key]);
3049+
break;
3050+
}
3051+
}
3052+
}
3053+
3054+
return $multiInsertData;
3055+
}
29793056
}

0 commit comments

Comments
 (0)