88use Magento \Catalog \Model \Product \Visibility ;
99use Magento \CatalogImportExport \Model \Import \Product \RowValidatorInterface as ValidatorInterface ;
1010use Magento \Framework \App \Filesystem \DirectoryList ;
11- use Magento \Framework \App \ObjectManager ;
1211use Magento \Framework \Model \ResourceModel \Db \ObjectRelationProcessor ;
1312use Magento \Framework \Model \ResourceModel \Db \TransactionManagerInterface ;
1413use 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