From bb6ce393de12e14b76dcb0166f58a93b116525b2 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Wed, 5 Apr 2023 12:17:04 +0100 Subject: [PATCH 1/5] Fixed faulty media gallery label/description management for mutistore projects --- .../Catalog/Product/Helper/Form/Gallery.php | 25 +- .../controllers/Catalog/ProductController.php | 3 - .../Model/Product/Attribute/Backend/Media.php | 10 +- .../catalog/product/helper/gallery.phtml | 213 +++--- js/mage/adminhtml/product.js | 701 +++++++++--------- 5 files changed, 495 insertions(+), 457 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php index bdd270a2933..7608ee1cf78 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php @@ -24,7 +24,6 @@ class Mage_Adminhtml_Block_Catalog_Product_Helper_Form_Gallery extends Varien_Da { public function getElementHtml() { - //$html.= $this->getAfterElementHtml(); return $this->getContentHtml(); } @@ -67,19 +66,31 @@ public function canDisplayUseDefault($attribute) /** * Check default value usage fact * - * @param Mage_Eav_Model_Entity_Attribute $attribute + * @param Mage_Eav_Model_Entity_Attribute|string $attribute * @return bool */ public function usedDefault($attribute) { - $attributeCode = $attribute->getAttributeCode(); - $defaultValue = $this->getDataObject()->getAttributeDefaultValue($attributeCode); + if (is_string($attribute)) { + $attributeCode = $attribute; + } else { + $attributeCode = $attribute->getAttributeCode(); + } + // special management for "label" and "position" since they're columns of the + // catalog_product_entity_media_gallery_value database table + if ($attributeCode == "label" || $attributeCode == "position") { + $media_gallery = $this->getDataObject()->getMediaGallery(); + if (!count($media_gallery["images"])) { + return true; + } + return $media_gallery["images"][0]["{$attributeCode}_use_default"]; + } + + $defaultValue = $this->getDataObject()->getAttributeDefaultValue($attributeCode); if (!$this->getDataObject()->getExistsStoreValueFlag($attributeCode)) { return true; - } elseif ($this->getValue() == $defaultValue && - $this->getDataObject()->getStoreId() != $this->_getDefaultStoreId() - ) { + } elseif ($this->getValue() == $defaultValue && $this->getDataObject()->getStoreId() != $this->_getDefaultStoreId()) { return false; } if ($defaultValue === false && !$attribute->getIsRequired() && $this->getValue()) { diff --git a/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php b/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php index 58e5634d4f1..d7b0c906473 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php @@ -580,9 +580,6 @@ protected function _initProductSave() $this->_filterStockData($productData['stock_data']); } - /** - * Websites - */ if (!isset($productData['website_ids'])) { $productData['website_ids'] = []; } diff --git a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php index b9b5e3258ee..480cce6d979 100644 --- a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php +++ b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php @@ -44,7 +44,10 @@ public function afterLoad($object) foreach ($this->_getResource()->loadGallery($object, $this) as $image) { foreach ($localAttributes as $localAttribute) { if (is_null($image[$localAttribute])) { + $image[$localAttribute . '_use_default'] = true; $image[$localAttribute] = $this->_getDefaultValue($localAttribute, $image); + } else { + $image[$localAttribute . '_use_default'] = false; } } $value['images'][] = $image; @@ -170,9 +173,7 @@ public function beforeSave($object) } Mage::dispatchEvent('catalog_product_media_save_before', ['product' => $object, 'images' => $value]); - $object->setData($attrCode, $value); - return $this; } @@ -205,7 +206,6 @@ public function afterSave($object) } $storeId = $object->getStoreId(); - $storeIds = $object->getStoreIds(); $storeIds[] = Mage_Core_Model_App::ADMIN_STORE_ID; @@ -244,8 +244,8 @@ public function afterSave($object) // Add per store labels, position, disabled $data = []; $data['value_id'] = $image['value_id']; - $data['label'] = $image['label']; - $data['position'] = (int) $image['position']; + $data['label'] = ($image['label'] === null || $image["label_use_default"]) ? null : $image['label']; + $data['position'] = ($image['position'] === null || $image["position_use_default"]) ? null : (int) $image['position']; $data['disabled'] = (int) $image['disabled']; $data['store_id'] = (int) $object->getStoreId(); diff --git a/app/design/adminhtml/default/default/template/catalog/product/helper/gallery.phtml b/app/design/adminhtml/default/default/template/catalog/product/helper/gallery.phtml index d68c7467583..19ccc8a2893 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/helper/gallery.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/helper/gallery.phtml @@ -13,101 +13,136 @@ * @license https://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> - - -
- -
- - - - - getImageTypes() as $typeId=>$type): ?> - - - - - - - - - - getImageTypes() as $typeId => $type): ?> - +
+
    +
  • +
      +
    • + __('Image type and information need to be specified for each store view.'); ?> +
    • +
    +
  • +
+
+
__('Image') ?>__('Label') ?>__('Sort Order') ?>escapeHtml($type['label'], ['br']); ?>
+ + + + getImageTypes() as $typeId => $type): ?> + - - - - - - - - - - getImageTypes() as $typeId=>$type): ?> - + + + + + + + + getImageTypes() as $typeId => $type): ?> + - - - - hasUseDefault()): ?> - - - - - getMediaAttributes() as $_attribute): ?> - + + + + + + + + + + getImageTypes() as $typeId => $type): ?> + - - - - - + + + + hasUseDefault()): ?> + + + + + getMediaAttributes() as $_attribute): ?> + + + + + + + - - - getImageTypes() as $typeId=>$type): ?> - + + + getImageTypes() as $typeId => $type): ?> + - - - - -getElement()->getReadonly()):?> - - - - - - -
__('Exclude') ?>__('Remove') ?>
__('Roll Over for preview') ?>
getElement()->getReadonly()):?> disabled="disabled" class="input-text" onkeyup="getJsObjectName(); ?>.updateImage('__file__')" onchange="getJsObjectName(); ?>.updateImage('__file__')" />getElement()->getReadonly()):?> disabled="disabled" class="input-text validate-number" onkeyup="getJsObjectName(); ?>.updateImage('__file__')" onchange="getJsObjectName(); ?>.updateImage('__file__')" />getElement()->getAttributeReadonly($typeId)) :?> disabled="disabled" type="radio" name="" onclick="getJsObjectName(); ?>.setProductImages('__file__')" value="__file__" />
__('Image') ?>__('Label') ?>__('Sort Order') ?>escapeHtml($type['label'], array('br')); ?> getElement()->getReadonly()):?> disabled="disabled" onclick="getJsObjectName(); ?>.updateImage('__file__')" />getElement()->getReadonly()):?> disabled="disabled" onclick="getJsObjectName(); ?>.updateImage('__file__')" />
__('Use Default Value') ?>   - getElement()->canDisplayUseDefault($_attribute)): ?> - getElement()->getAttributeReadonly($_attribute->getAttributeCode())):?> disabled="disabled" onclick="getJsObjectName(); ?>.updateUseDefault()" -getElement()->usedDefault($_attribute)): ?>checked value="getAttributeCode() ?>" /> - - __('Exclude') ?>__('Remove') ?>
+
+ __('Roll Over for preview') ?>
+
getElement()->getReadonly()): ?> disabled="disabled" + class="input-text" + onkeyup="getJsObjectName(); ?>.updateImage('__file__')" + onchange="getJsObjectName(); ?>.updateImage('__file__')"/>getElement()->getReadonly()): ?> disabled="disabled" + class="input-text validate-number" + onkeyup="getJsObjectName(); ?>.updateImage('__file__')" + onchange="getJsObjectName(); ?>.updateImage('__file__')"/> + getElement()->getAttributeReadonly($typeId)) : ?> disabled="disabled" + type="radio" name="" + onclick="getJsObjectName(); ?>.setProductImages('__file__')" + value="__file__"/>   
getElement()->getReadonly()): ?> disabled="disabled" + onclick="getJsObjectName(); ?>.updateImage('__file__')"/>getElement()->getReadonly()): ?> disabled="disabled" + onclick="getJsObjectName(); ?>.updateImage('__file__')"/>
__('Use Default Value') ?> + getElement()->getAttributeReadonly("label")): ?> disabled="disabled" + onclick="getJsObjectName(); ?>.updateUseDefault(this)" + getElement()->usedDefault("label")): ?>checked + value="label"/> + + getElement()->getAttributeReadonly("position")): ?> disabled="disabled" + onclick="getJsObjectName(); ?>.updateUseDefault(this)" + getElement()->usedDefault("position")): ?>checked + value="position"/> + + getElement()->canDisplayUseDefault($_attribute)): ?> + getElement()->getAttributeReadonly($_attribute->getAttributeCode())): ?> disabled="disabled" + onclick="getJsObjectName(); ?>.updateUseDefault()" + getElement()->usedDefault($_attribute)): ?>checked + value="getAttributeCode() ?>"/> + +   
__('No image') ?>  getElement()->getAttributeReadonly($typeId)) :?> disabled="disabled" name="" onclick="getJsObjectName(); ?>.setProductImages('no_selection')" value="no_selection" />  getElement()->getAttributeReadonly($typeId)) : ?> disabled="disabled" + name="" + onclick="getJsObjectName(); ?>.setProductImages('no_selection')" + value="no_selection"/>   
- __('Maximum width and height dimension for upload image is %s.', Mage::getStoreConfig(Mage_Catalog_Helper_Image::XML_NODE_PRODUCT_MAX_DIMENSION)); ?> - getUploaderHtml() ?> -
-
+   +   + + + getElement()->getReadonly()): ?> + + + + __('Maximum width and height dimension for upload image is %s.', Mage::getStoreConfig(Mage_Catalog_Helper_Image::XML_NODE_PRODUCT_MAX_DIMENSION)); ?> + getUploaderHtml() ?> + + + + + +
- - + + From 770d26331d3deaae5ddb8ae303c534df1d55a95f Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 14 Sep 2023 09:48:51 +0200 Subject: [PATCH 3/5] fix use default (#22) * fix tpl media gallery * fix save eav attribute labels * fix use label default * remove unecessary var * clean * fix use default checked * fix use default --------- Co-authored-by: Fabrizio Balliano --- .../Mage/Catalog/Model/Product/Attribute/Backend/Media.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php index 056c50ab0d3..08b256495b5 100644 --- a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php +++ b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php @@ -168,11 +168,11 @@ public function beforeSave($object) foreach ($value['values'] as $mediaAttrCode => $attrData) { if (array_key_exists($attrData, $newImages)) { - $object->setData($mediaAttrCode . '_label', $newImages[$attrData]['label'] ?: $newImages[$attrData]['label_default']); + $object->setData($mediaAttrCode . '_label', ($newImages[$attrData]['label'] === null || $newImages[$attrData]['label_use_default']) ? $newImages[$attrData]['label_default'] : $newImages[$attrData]['label']); } if (array_key_exists($attrData, $existImages)) { - $object->setData($mediaAttrCode . '_label', $existImages[$attrData]['label'] ?: $existImages[$attrData]['label_default']); + $object->setData($mediaAttrCode . '_label', ($existImages[$attrData]['label'] === null || $existImages[$attrData]['label_use_default']) ? $existImages[$attrData]['label_default'] : $existImages[$attrData]['label']); } } Mage::dispatchEvent('catalog_product_media_save_before', ['product' => $object, 'images' => $value]); From dfe31b01ad3aecff43bbc7c22fd19564bb84d7d3 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Fri, 19 Apr 2024 12:36:39 +0100 Subject: [PATCH 4/5] whitespace --- .../Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php | 3 ++- .../Mage/Catalog/Model/Product/Attribute/Backend/Media.php | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php index ff1dcddddc6..4f865355dc8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php @@ -37,7 +37,8 @@ public function getContentHtml() $content = Mage::getSingleton('core/layout') ->createBlock('adminhtml/catalog_product_helper_form_gallery_content'); - $content->setId($this->getHtmlId() . '_content') + $content + ->setId($this->getHtmlId() . '_content') ->setElement($this); return $content->toHtml(); } diff --git a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php index 08b256495b5..bf2e9a7d1d9 100644 --- a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php +++ b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php @@ -126,7 +126,7 @@ public function beforeSave($object) if (!empty($image['removed'])) { $clearImages[] = $image['file']; } elseif (!isset($image['value_id'])) { - $newFile = $this->_moveImageFromTmp($image['file']); + $newFile = $this->_moveImageFromTmp($image['file']); $image['new_file'] = $newFile; $newImages[$image['file']] = $image; $this->_renamedImages[$image['file']] = $newFile; @@ -149,8 +149,6 @@ public function beforeSave($object) ]; $duplicate[$image['value_id']] = $newFile; } - - $value['duplicate'] = $duplicate; } foreach ($object->getMediaAttributes() as $mediaAttribute) { @@ -175,6 +173,7 @@ public function beforeSave($object) $object->setData($mediaAttrCode . '_label', ($existImages[$attrData]['label'] === null || $existImages[$attrData]['label_use_default']) ? $existImages[$attrData]['label_default'] : $existImages[$attrData]['label']); } } + Mage::dispatchEvent('catalog_product_media_save_before', ['product' => $object, 'images' => $value]); $object->setData($attrCode, $value); return $this; From dcfad7b689dee812525c0f268ef37eae80248725 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Fri, 19 Apr 2024 12:59:22 +0100 Subject: [PATCH 5/5] Fixed small/image/thumb selection for newly uploaded images --- .../Mage/Catalog/Model/Product/Attribute/Backend/Media.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php index bf2e9a7d1d9..3b58e89d5a3 100644 --- a/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php +++ b/app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php @@ -130,7 +130,7 @@ public function beforeSave($object) $image['new_file'] = $newFile; $newImages[$image['file']] = $image; $this->_renamedImages[$image['file']] = $newFile; - $image['file'] = $newFile; + $image['file'] = $newFile; } else { $existImages[$image['file']] = $image; } @@ -166,6 +166,7 @@ public function beforeSave($object) foreach ($value['values'] as $mediaAttrCode => $attrData) { if (array_key_exists($attrData, $newImages)) { + $object->setData($mediaAttrCode, $newImages[$attrData]['new_file']); $object->setData($mediaAttrCode . '_label', ($newImages[$attrData]['label'] === null || $newImages[$attrData]['label_use_default']) ? $newImages[$attrData]['label_default'] : $newImages[$attrData]['label']); }