Magento – How to update configurable associated products programmatically

configurable-productmagento-1.9

I'm trying to update configurable associated products. When I save my product I get this error:

Integrity constraint violation: 1062 Duplicate entry '183-137' for key 'UNQ_CATALOG_PRODUCT_SUPER_ATTRIBUTE_PRODUCT_ID_ATTRIBUTE_ID'
, query was: INSERT INTO `catalog_product_super_attribute` (`product_id`, `attribute_id`) VALUES (?,
 ?)<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

How can I update the configurable associated products?

Best Answer

i use this code to insert and update configurable product in my custom extention.

where all data get in data variable
$pid is configurable product id.
$aid is attribute id.
before you use this code u set session variable is edit to 0 or 1. 0- if new product , 1- if edit existing product

$data = $this->getRequest ()->getPost();
            $pid=Mage::getSingleton('core/session')->getAttributeId();
            $aid=Mage::getSingleton('core/session')->getAttributeValue();
            Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
            $prd = Mage::getModel('catalog/product')->load($pid);
            try
            {
                $totalRow=count($data['product_id']);
                if($totalRow>0)
                {
                         $configurable = Mage::getModel('catalog/product')->load($pid);
                         if(!Mage::getSingleton('core/session')->getIsEdit(0))
                         {
                            $configurable->getTypeInstance()->setUsedProductAttributeIds(array($aid));
                         }
                         $configurable->save();
                         $productModel = Mage::getModel('catalog/product');
                         $configAttributeCode = $productModel->getResource()->getAttribute($aid)->getAttributeCode();
                         $simpleProducts = Mage::getResourceModel('catalog/product_collection')
                                ->addIdFilter($data['product_id'])
                                ->addAttributeToSelect($configAttributeCode);

                         $configurableProductsData = array();
                         $configurableAttributesData = $configurable->getTypeInstance()->getConfigurableAttributesAsArray();

                            for($l=0;$l<$totalRow;$l++)
                            {
                                $_product = Mage::getModel('catalog/product')->load($data['product_id'][$l]);
                                $_product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE);
                                $_product->getResource()->save($_product);
                                $productModel = Mage::getModel('catalog/product');
                                $attr = $productModel->getResource()->getAttribute($aid);
                                $att_label = $attr->getSource()->getOptionText($data['attribute_type'][$l]);
                                $productData = array( 
                                        'label' => $att_label, //attribute label
                                        'attribute_id' => $aid, //attribute ID 
                                        'value_index' => $data['attribute_type'][$l],
                                        'is_percent' => '0', //fixed/percent price for this option
                                        'pricing_value' => $data['product_price'][$l] //value for the pricing
                                );
                                $configurableProductsData[$_product->getId()] = $productData;
                                $configurableAttributesData[0]['values'][$l] = $productData;
                            }

                            $configurable->setConfigurableProductsData($configurableProductsData);
                            $configurable->setConfigurableAttributesData($configurableAttributesData);
                            Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
                            $configurable->setCanSaveConfigurableAttributes(true);
                            $configurable->setStatus(1);
                            $configurable->save();

                }
            }
            catch(Exception $e)
            {
                echo $e->getMessage();  
            }
Related Topic