diff --git a/vendor/magento/module-catalog/Model/Product/Gallery/UpdateHandler.php b/vendor/magento/module-catalog/Model/Product/Gallery/UpdateHandler.php index edee9aef508d..e7c113c6c347 100644 --- a/vendor/magento/module-catalog/Model/Product/Gallery/UpdateHandler.php +++ b/vendor/magento/module-catalog/Model/Product/Gallery/UpdateHandler.php @@ -13,17 +13,21 @@ use Magento\Eav\Model\ResourceModel\AttributeValue; use Magento\Framework\App\ObjectManager; use Magento\Framework\EntityManager\MetadataPool; +use Magento\Framework\Exception\FileSystemException; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Filesystem; use Magento\Framework\Json\Helper\Data; use Magento\MediaStorage\Helper\File\Storage\Database; use Magento\Store\Model\Store; use Magento\Store\Model\StoreManagerInterface; +use Magento\Catalog\Model\Product\Image\RemoveDeletedImagesFromCache; /** * Update handler for catalog product gallery. * * @api * @since 101.0.0 + * @SuppressWarnings(PHPMD.ExcessiveParameterList) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class UpdateHandler extends CreateHandler @@ -33,6 +37,11 @@ class UpdateHandler extends CreateHandler */ private $attributeValue; + /** + * @var RemoveDeletedImagesFromCache + */ + private $removeDeletedImagesFromCache; + /** * @param MetadataPool $metadataPool * @param ProductAttributeRepositoryInterface $attributeRepository @@ -43,6 +52,8 @@ class UpdateHandler extends CreateHandler * @param Database $fileStorageDb * @param StoreManagerInterface|null $storeManager * @param AttributeValue|null $attributeValue + * @param RemoveDeletedImagesFromCache|null $removeDeletedImagesFromCache + * @throws FileSystemException */ public function __construct( MetadataPool $metadataPool, @@ -53,7 +64,8 @@ public function __construct( Filesystem $filesystem, Database $fileStorageDb, StoreManagerInterface $storeManager = null, - ?AttributeValue $attributeValue = null + ?AttributeValue $attributeValue = null, + ?RemoveDeletedImagesFromCache $removeDeletedImagesFromCache = null ) { parent::__construct( $metadataPool, @@ -66,6 +78,8 @@ public function __construct( $storeManager ); $this->attributeValue = $attributeValue ?: ObjectManager::getInstance()->get(AttributeValue::class); + $this->removeDeletedImagesFromCache = $removeDeletedImagesFromCache ?: + ObjectManager::getInstance()->get(RemoveDeletedImagesFromCache::class); } /** @@ -102,6 +116,7 @@ protected function processDeletedImages($product, array &$images) $this->deleteMediaAttributeValues($product, $imagesToDelete); $this->resourceModel->deleteGallery($recordsToDelete); $this->removeDeletedImages($filesToDelete); + $this->removeDeletedImagesFromCache->removeDeletedImagesFromCache($filesToDelete); } /** @@ -181,6 +196,7 @@ protected function extractStoreIds($product) * * @param array $files * @return null + * @throws FileSystemException * @since 101.0.0 */ protected function removeDeletedImages(array $files) @@ -198,6 +214,7 @@ protected function removeDeletedImages(array $files) * * @param Product $product * @param string[] $images + * @throws LocalizedException */ private function deleteMediaAttributeValues(Product $product, array $images): void { diff --git a/vendor/magento/module-catalog/Model/Product/Image/ConvertImageMiscParamsToReadableFormat.php b/vendor/magento/module-catalog/Model/Product/Image/ConvertImageMiscParamsToReadableFormat.php new file mode 100644 index 000000000000..b445c830834b --- /dev/null +++ b/vendor/magento/module-catalog/Model/Product/Image/ConvertImageMiscParamsToReadableFormat.php @@ -0,0 +1,36 @@ +presentationConfig = $presentationConfig; + $this->encryptor = $encryptor; + $this->mediaConfig = $mediaConfig; + $this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA); + $this->imageParamsBuilder = $imageParamsBuilder; + $this->convertImageMiscParamsToReadableFormat = $convertImageMiscParamsToReadableFormat; + } + + /** + * Remove deleted images from cache. + * + * @param array $files + * @throws FileSystemException + */ + public function removeDeletedImagesFromCache(array $files) + { + if (count($files) > 0) { + $images = $this->presentationConfig + ->getViewConfig(['area' => \Magento\Framework\App\Area::AREA_FRONTEND]) + ->getMediaEntities( + 'Magento_Catalog', + Image::MEDIA_TYPE_CONFIG_NODE + ); + + foreach ($images as $imageData) { + $imageMiscParams = $this->imageParamsBuilder->build($imageData); + + if (isset($imageMiscParams['image_type'])) { + unset($imageMiscParams['image_type']); + } + + $cacheId = $this->encryptor->hash( + implode('_', $this->convertImageMiscParamsToReadableFormat + ->convertImageMiscParamsToReadableFormat($imageMiscParams)), + Encryptor::HASH_VERSION_MD5 + ); + + $catalogPath = $this->mediaConfig->getBaseMediaPath(); + + foreach ($files as $filePath) { + $this->mediaDirectory->delete( + $catalogPath . '/cache/' . $cacheId . '/' . $filePath + ); + } + } + } + } +} diff --git a/vendor/magento/module-catalog/Model/View/Asset/Image.php b/vendor/magento/module-catalog/Model/View/Asset/Image.php index 0f7082f9df15..cf37aa695e5f 100644 --- a/vendor/magento/module-catalog/Model/View/Asset/Image.php +++ b/vendor/magento/module-catalog/Model/View/Asset/Image.php @@ -6,15 +6,16 @@ namespace Magento\Catalog\Model\View\Asset; +use Magento\Catalog\Helper\Image as ImageHelper; use Magento\Catalog\Model\Config\CatalogMediaConfig; +use Magento\Catalog\Model\Product\Image\ConvertImageMiscParamsToReadableFormat; use Magento\Catalog\Model\Product\Media\ConfigInterface; +use Magento\Framework\App\ObjectManager; use Magento\Framework\Encryption\Encryptor; use Magento\Framework\Encryption\EncryptorInterface; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\View\Asset\ContextInterface; use Magento\Framework\View\Asset\LocalInterface; -use Magento\Catalog\Helper\Image as ImageHelper; -use Magento\Framework\App\ObjectManager; use Magento\Store\Model\StoreManagerInterface; /** @@ -78,6 +79,11 @@ class Image implements LocalInterface */ private $mediaFormatUrl; + /** + * @var ConvertImageMiscParamsToReadableFormat + */ + private $convertImageMiscParamsToReadableFormat; + /** * Image constructor. * @@ -89,6 +95,7 @@ class Image implements LocalInterface * @param ImageHelper $imageHelper * @param CatalogMediaConfig $catalogMediaConfig * @param StoreManagerInterface $storeManager + * @param ConvertImageMiscParamsToReadableFormat $convertImageMiscParamsToReadableFormat */ public function __construct( ConfigInterface $mediaConfig, @@ -98,7 +105,8 @@ public function __construct( array $miscParams, ImageHelper $imageHelper = null, CatalogMediaConfig $catalogMediaConfig = null, - StoreManagerInterface $storeManager = null + StoreManagerInterface $storeManager = null, + ?ConvertImageMiscParamsToReadableFormat $convertImageMiscParamsToReadableFormat = null ) { if (isset($miscParams['image_type'])) { $this->sourceContentType = $miscParams['image_type']; @@ -116,6 +124,8 @@ public function __construct( $catalogMediaConfig = $catalogMediaConfig ?: ObjectManager::getInstance()->get(CatalogMediaConfig::class); $this->mediaFormatUrl = $catalogMediaConfig->getMediaUrlFormat(); + $this->convertImageMiscParamsToReadableFormat = $convertImageMiscParamsToReadableFormat ?: + ObjectManager::getInstance()->get(ConvertImageMiscParamsToReadableFormat::class); } /** @@ -283,17 +293,6 @@ private function getImageInfo() */ private function convertToReadableFormat(array $miscParams) { - $miscParams['image_height'] = 'h:' . ($miscParams['image_height'] ?? 'empty'); - $miscParams['image_width'] = 'w:' . ($miscParams['image_width'] ?? 'empty'); - $miscParams['quality'] = 'q:' . ($miscParams['quality'] ?? 'empty'); - $miscParams['angle'] = 'r:' . ($miscParams['angle'] ?? 'empty'); - $miscParams['keep_aspect_ratio'] = (!empty($miscParams['keep_aspect_ratio']) ? '' : 'non') . 'proportional'; - $miscParams['keep_frame'] = (!empty($miscParams['keep_frame']) ? '' : 'no') . 'frame'; - $miscParams['keep_transparency'] = (!empty($miscParams['keep_transparency']) ? '' : 'no') . 'transparency'; - $miscParams['constrain_only'] = (!empty($miscParams['constrain_only']) ? 'do' : 'not') . 'constrainonly'; - $miscParams['background'] = !empty($miscParams['background']) - ? 'rgb' . implode(',', $miscParams['background']) - : 'nobackground'; - return $miscParams; + return $this->convertImageMiscParamsToReadableFormat->convertImageMiscParamsToReadableFormat($miscParams); } }