2

I have attribute sets which I use when adding new products. All products have a weight attribute. I know you can set up a default value which will appear along all attribute sets with that attribute. My question is can I set up different default weight for each attribute set? and if so any tips on how I can achieve it would be highly helpful.

I use Magento Commerce 1.7.0.2

Fabian Schmengler
66.2k25 gold badges191 silver badges422 bronze badges
asked Feb 23, 2015 at 17:11

2 Answers 2

3

Interesting question. With default Magento, you can't. But there are ways. I'd recommend creating an extension that listens to the catalog_product_save_before event in the adminhtml scope.

Create the file app/etc/modules/Your_Module.xml with the following content;

<?xml version="1.0"?>
<config>
 <modules>
 <Your_Module>
 <active>true</active>
 <codePool>local</codePool>
 </Your_Module>
 </modules>
</config>

Next up, app/code/local/Your/Module/etc/config.xml, where we declare the event to listen for and which method to execute;

<?xml version="1.0"?>
<config>
 <modules>
 <Your_Module>
 <version>0.1.0</version>
 </Your_Module>
 </modules>
 <adminhtml>
 <events>
 <catalog_product_load_after>
 <observers>
 <your_module>
 <class>Your_Module_Model_Observer</class>
 <method>setDefaultWeightValue</method>
 </your_module>
 </observers>
 </catalog_product_load_after>
 </events>
 </adminhtml>
 <global>
 <models>
 <your_module>
 <class>Your_Module_Model</class>
 </your_module>
 </models>
 </global>
</config>

And finally, app/code/local/Your/Module/Model/Observer.php, where we set the predefined weights for the different attribute set IDs and where we assign the value to the product currently opened;

<?php
class Your_Module_Model_Observer {
 // This is the default value you would like to use
 const DEFAULT_WEIGHT = 50;
 // Change this if you have set a default value on the attribute other than empty
 const DEFAULT_WEIGHT_SETTING_MAGENTO = '0.0000';
 public function setDefaultWeightValue($observer) {
 $_product = $observer->getProduct();
 if($_product->getWeight() == self::DEFAULT_WEIGHT_SETTING_MAGENTO) {
 $_product->setWeight(
 $this->getWeightsPerAttributeSet($_product->getAttributeSetId())
 );
 }
 }
 public function getWeightsPerAttributeSet($attributeSetId) {
 $weightsPerAttribuetSet = array(
 4 => 100,
 5 => 200,
 6 => 300
 );
 if(isset($weightsPerAttribuetSet[$attributeSetId])) {
 return $weightsPerAttribuetSet[$attributeSetId];
 } else {
 return self::DEFAULT_WEIGHT;
 }
 }
}

This will only work for existing products, since new products aren't loaded and thus won't fire the event.

answered Jan 16, 2016 at 18:16
2

I would create an observer for catalog_product_save_before, which is triggered the first time, when this form is submitted:

New Product

which saves the product with id, type and attribute set and redirects you to the edit page. So ther you will see the new default values that you choose dynamically based on the attribute set.

To prevent saving them again on subsequent saves, use isObjectNew():

if ($product->isObjectNew()) {
 // set default values here, based on attribute set
}
answered Jan 17, 2016 at 0:20

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.