2
votes

I am trying to create configurable product with the attributes color and size from simple product collection.

To achieve this, I created a custom attribute named configurable_sku for respective simple products and filled with common SKU. Using this SKU we can group to create a configurable product.

I got collection from $product_sku_collection['sku'] like below,

...
array (size=387)
  0 => 
    array (size=2)
      'conf' => string '753315' (length=6)
      'simpleprodcollection' => 
        array (size=1)
          0 => 
            array (size=10)
              ...
  1 => 
    array (size=2)
      'conf' => string '753319' (length=6)
      'simpleprodcollection' => 
        array (size=1)
          0 => 
            array (size=10)
              ...

Below is the php script which i tried so far.

<?php
set_time_limit(0);
error_reporting(E_ALL | E_STRICT);
error_reporting(1);
ini_set('display_errors', 1);
define('D_S', DIRECTORY_SEPARATOR);
require_once 'app/Mage.php';
umask(0);
Mage::app();
if (function_exists('d') === false) {

    function d($data, $die = 0, $z = 1, $msg = 1) {
        echo"<br/><pre style='padding:2px 5px;background: none repeat scroll 0 0 #E04E19;clear: both;color: #FFFFFF;float: left;font-family: Times New Roman;font-style: italic;font-weight: bold;text-align: left;'>";
        if ($z == 1)
            Zend_Debug::dump($data);
        else if ($z == 2)
            var_dump($data);
        else
            print_r($data);
        echo"</pre>";
        if ($d == 1)
            die();
    }

}

function get_attribute_id($option, $type) {
    $attributeId = Mage::getResourceModel('eav/entity_attribute')->getIdByCode('catalog_product', $type);
    $attribute = Mage::getModel('catalog/resource_eav_attribute')->load($attributeId);
    $attributeOptions = $attribute->getSource()->getAllOptions();

    foreach ($attributeOptions as $opts_arr) {
        if (strtoupper($opts_arr['label']) == strtoupper($option)) {
            return $opts_arr['value'];
        }
    }
    return FALSE;
}

$_simple_products = array();

function attributeValueExists($arg_attribute, $arg_value) {
    $attribute_model = Mage::getModel('eav/entity_attribute');
    $attribute_options_model = Mage::getModel('eav/entity_attribute_source_table');

    $attribute_code = $attribute_model->getIdByCode('catalog__simple_product', $arg_attribute);
    $attribute = $attribute_model->load($attribute_code);

    $attribute_table = $attribute_options_model->setAttribute($attribute);
    $options = $attribute_options_model->getAllOptions(false);

    foreach ($options as $option) {
        if ($option['label'] == $arg_value) {
            return $option['value'];
        }
    }

    return false;
}

//$_product = Mage::getModel('catalog/product')->load(46);
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('*');
// d($collection->getData()); exit;
$in = 0;
$product_sku_collection = array();
$product_dummy_collection = array();
foreach ($collection->getData() as $val) {

    $product_dummy_collection[$in] = $val;
    $collection = Mage::getModel('catalog/product')->getCollection();
    $collection->addAttributeToFilter('confiugrable_sku', array('eq', $val['sku']));
    if (count($collection->getData()) > 0) {
        $product_sku_collection['sku'][$in]['conf'] = $val['sku'];
        $product_sku_collection['sku'][$in]['simpleprodcollection'] = $collection->getData();
        $in++;
    }
}
$color_attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 92);
foreach ($color_attribute->getSource()->getAllOptions(true, true) as $option) {
    $attributeArray[$option['value']] = $option['label'];
}
//d($attributeArray); exit;
$color_array = array();
$index = 0;
foreach ($attributeArray as $value) {
    $value_index = get_attribute_id($value, 'color');
    if ($value != '') {
        $color_array[$index] = array(
            'value_index' => $value_index,
            'label' => $value,
            'is_percent' => 0,
            'pricing_value' => '0',
            'attribute_id' => '92'
        );
        $index++;
    }
}
//d($color_array); exit;
$size_attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 136);
foreach ($size_attribute->getSource()->getAllOptions(true, true) as $option) {
    $sattributeArray[$option['value']] = $option['label'];
}
//d($attributeArray); exit;
$size_array = array();
$index = 0;
foreach ($sattributeArray as $value) {
    $value_index = get_attribute_id($value, 'size');
    if ($value != '') {
        $size_array[$index] = array(
            'value_index' => $value_index,
            'label' => $value,
            'is_percent' => 0,
            'pricing_value' => '0',
            'attribute_id' => '92'
        );
        $index++;
    }
}
//d($size_array); exit;
// exit;
$cProduct = Mage::getModel('catalog/product');
$model = Mage::getModel('catalog/product');
$setConfigurableAttributesData = array(
    '0' => array('id' => NULL, 'label' => 'Color', 'position' => NULL,
        'values' => $color_array,
        'attribute_id' => 92, 'attribute_code' => 'color', 'frontend_label' => 'Color',
        'html_id' => 'config_super_product__attribute_0'
    ),
    '1' => array('id' => NULL, 'label' => 'Clothing Size', 'position' => NULL,
        'values' => $size_array,
        'attribute_id' => 136, 'attribute_code' => 'size', 'frontend_label' => 'Clothing Size',
        'html_id' => 'config_super_product__attribute_1')
);
//d(($product_sku_collection['sku'])); exit;
$index = 1;
foreach ($product_sku_collection['sku'] as $key => $value) {
    $main_product_data = $model->load($value['simpleprodcollection']['0']['entity_id']);
    $main_pd_name = $main_product_data->getData('name');
    $setConfigurableProductsData=array();
    //d($value['simpleprodcollection']['0']['entity_id']); 
    foreach ($value['simpleprodcollection'] as $v) {
        $clab = Mage::getModel('catalog/product')->load($v['entity_id'])->getAttributeText('color');
        $cvalue_index = Mage::getResourceModel('catalog/product')->getAttributeRawValue($v['entity_id'], 'color');
        $slab = Mage::getModel('catalog/product')->load($v['entity_id'])->getAttributeText('size');
        $svalue_index = Mage::getResourceModel('catalog/product')->getAttributeRawValue($v['entity_id'], 'size');
        $setConfigurableProductsData = array(
            $v['entity_id'] =>
            array('0' =>
                array('attribute_id' => '92', 'label' => $clab, 'value_index' => $cvalue_index, 'is_percent' => 0, 'pricing_value' => ''),
                '1' =>
                array('attribute_id' => '136', 'label' => $slab, 'value_index' => $svalue_index, 'is_percent' => 0, 'pricing_value' => '')
            )
        );
        //d($setConfigurableProductsData);
    }
    $cProduct
            ->setTypeId(Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE)
            ->setTaxClassId(5)
            ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)
            ->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED)
            ->setWebsiteIds(array(1))
            ->setAttributeSetId(4) // You can determine this another way if you need to.
            ->setSku("C" . $main_product_data->getData('confiugrable_sku'))
            ->setName($main_product_data->getData('name'))
            ->setQty(25)
            ->setPlayer($main_product_data->getData('player'))
            ->setBrand($main_product_data->getData('brand'))
            ->setStyle($main_product_data->getData('style'))
            ->setShortDescription($main_product_data->getData('short_description'))
            ->setDescription($main_product_data->getData('description'))
            ->setPrice($main_product_data->getData('price'));
    $cProduct->setStockData(array(
        'use_config_manage_stock' => 1,
        'is_in_stock' => 1,
        'is_salable' => 1,
    ));
    $cProduct->setConfigurableProductsData($setConfigurableProductsData);
    $cProduct->setConfigurableAttributesData($setConfigurableAttributesData);
    $cProduct->setCanSaveConfigurableAttributes(1);
    try {
        $cProduct->save();
        //$productId = $cProduct->getId();
        echo $index.") ".$cProduct->getId() . "====>" . $main_pd_name . "   added\n";
    } catch (Exception $e) {
        echo "$main_pd_name  not added\n";
        echo "exception:$e";
    }
    $index++;
}
//****************-----------------*****************//
?>

When I run this script, it has to insert 387 configurable products with their respective simple product. But loop runs one time and stops executing, It inserts only one configurable product with their associated simple product but it has to insert all 387 configurable products. Where have I gone wrong in this. I checked all the way to find it but could not.

Kindly give some advice on this

2
Any errors anywhere (logs)? - John V.
@AlexLunix No error occurs in screen. when i ran this,I got message as "1) 3802====>Tshirt added". Only first configurable product in array had been inserted successfully. - mymotherland
actually if i disable this $cProduct->save(); loop runs fine. but this has to be save in each time. any idea ? - mymotherland

2 Answers

4
votes

Finally i found it, we need to use below code inside for loop

 $cProduct->save();
 $cProduct->unsetData();

To make magento recognize your data as a new model again, you simply need to unset the model id

-1
votes

Mage::getModel('catalog/product'); this actually queries Magento registry and fetch a cached object of that model type, this style of reusing objects is known as Singleton and Magento is known for that. In cases of loops and continuous need for a new unique object, use the standard constructor call of that model. For example in case of products:
$cProduct = new Mage_Catalog_Model_Product();