以编程方式创建可配置产品 - 不保存pricing_value

时间:2014-12-17 12:11:01

标签: magento configurable-product

我有一个自定义的xml文件,我大量导入了这些产品。我在配置下有一些简单的产品。一切运作良好,可配置的产品是用简单的产品和相关产品创造的。标签,但最后一件事仍然不起作用:每种产品的价格。

实际上,每个简单的产品都有自己的价格,正确的值可以很好地保存在其属性中,但是在超级产品属性配置中#34;面板,值为空。

Super product attributes configuration

当我手动填写价格字段时,它可以工作,但显然必须由脚本以编程方式完成。

这是我创建可配置产品的功能:

protected function createConfigurableProductFromSimpleProduct($product, $flagshipID)
{
    $configurableProduct = $product->duplicate();
    $configurableProduct->getResource()->save($configurableProduct);
    $configurableProduct= Mage::getModel('catalog/product')->load($configurableProduct->getId());

    $configurableProduct->setTypeId(Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE)
                     ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)
                     ->setSku($flagshipID)
                     ->setDefRef($product_id)
                     ->getTypeInstance()->setUsedProductAttributeIds(array($this->getAttributeId('root_colors'))); //attribute ID of attribute 'root_colors' in my store

    $configurableProduct->setName($configurableProduct->getName());
    $configurableProduct->setStatus(1);
    $configurableProduct->setStockData(array(
        'is_in_stock' => 1
    ));
    $configurableProduct->setUrlKey($configurableProduct->getName());
    $configurableProduct->save();

    return $configurableProduct;
}

以下是将简单产品链接到此可配置产品的代码:

protected function linkSimpleProductsToConfigurableProduct($simpleProducts, $configurableProduct)
{
    $configurableProductsData = array();
    foreach ($simpleProducts as $_product) {
        $_product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE);
        $_product->getResource()->save($_product);
        $configurableProductsData[$_product->getId()] = array( //[id] = id of a simple product associated with this configurable
            '0' => array(
                'label'         => $this->getAttributeRawValue($this->getAttributeId('root_colors'), $_product->getRoot()), //attribute label
                'attribute_id'  => $this->getAttributeId('root_colors'), //attribute ID of discriminator attribute in my store
                'value_index'   => $_product->getColor(),
                'pricing_value' => $_product->getPrice(),
                'is_percent'    => '0'
            )
        );
    }
    $configurableAttributesData = $configurableProduct->getTypeInstance()->getConfigurableAttributesAsArray();
    $configurableProduct->setCanSaveConfigurableAttributes(true);
    $configurableProduct->setConfigurableAttributesData($configurableAttributesData);
    $configurableProduct->setConfigurableProductsData($configurableProductsData);
    var_dump('saving configurable product after having link some simple products');
    $configurableProduct->save();
}

欢迎任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

Hy all!看了千万个答案后我解决了!

    $cProduct->setCanSaveConfigurableAttributes(true); 
    $cProduct->setCanSaveCustomOptions(true);
    $cProductTypeInstance = $cProduct->getTypeInstance();
    $cProductTypeInstance->setUsedProductAttributeIds(array($attribute_id));

    $attributes_array = $cProductTypeInstance->getConfigurableAttributesAsArray();
    foreach($attributes_array as $key => $attribute_array) {
         $attributes_array[$key]['use_default'] = 0; 
         $attributes_array[$key]['position'] = 0;   
         if (isset($attribute_array['frontend_label'])) {
             $attributes_array[$key]['label'] = $attribute_array['frontend_label']; 
         } else {
             $attributes_array[$key]['label'] = $attribute_array['attribute_code']; 
         }

    }   

    $dataArray = array();
    foreach ($simpleProducts as $simpleArray) {
         $dataArray[$simpleArray['id']] = array( 
            "label" => $simpleArray['label'],
            "attribute_id" => $simpleArray['attr_id'], 
            "value_index" => $simpleArray['value'],
            "is_percent" => '0', 
            "pricing_value" => $simpleArray['price'] 
        ); 
    }   


// MAIN MOD! Here i prepare an array for attributesData.
        $valuesArray = array();
        foreach($dataArray as $data){
            $valuesArray[] = $data; 
        }

    // MAIN MOD! 
    // this is not the best, but in my case I've only one attribute.
    $attributes_array[0]['values'] = $valuesArray;
    $cProduct->setConfigurableProductsData($dataArray);
    $cProduct->setConfigurableAttributesData($attributes_array);

我不发布所有代码,但我看到通过这些小修改它解决了问题!

答案 1 :(得分:0)

我遇到了完全相同的问题,并怀疑这是由于Magento 1.9中的某些原因造成的。我已经尝试了几个代码解决方法,但它们都没有工作。嗯,和你一样痛苦。

而不是提供进一步的评论,我只会提供答案;)

我深入研究了这一点,发现setConfigurableProductsData()调用旨在设置产品信息,但标志“pricing_value”根本不起作用(至少它在Magento 1.9中不起作用)。该调用仅用于标识作为此可配置产品一部分的简单产品。相反,需要使用setConfigurableAttributesData()调用来定义简单产品和定价之间的关系。

以下代码对我有用:它将特定选项值(用value_index标识)的定义与特定价格(pricing_value)一起移动,作为属性数据的一部分,而不是产品数据。

$configurableAttributeSizeValues = array();
foreach($simpleProducts as $simpleProduct) {
    $configurableAttributeSizeValues[] = array(
        'label' => $simpleProduct->getAttributeText('size'),
        'value_index' => $simpleProduct->getSize(),
        'is_percent' => false,
        'pricing_value' => $simpleProduct->getPrice(),
    );
}
$configurableAttributeSize = array(
    'id' => null,
    'label' => 'Size',
    'frontend_label' => 'Size',
    'attribute_id' => $attribute->getId(),
    'attribute_code' => 'size',
    'values' => $configurableAttributeSizeValues,
    'position' => 0,
);
$configurableAttributesData = array($configurableAttributeSize);

$configurableProductsIds = array();
foreach($simpleProducts as $simpleProduct) {
    $configurableProductsIds[$simpleProduct->getId()] = $simpleProduct->getId();
}

$product->setConfigurableProductsData($configurableProductsIds);
$product->setConfigurableAttributesData($configurableAttributesData);
$product->setCanSaveConfigurableAttributes(true);

在使用此代码之前,我已经加载了一个名为$ simpleProducts的产品集合和一个属性$ attribute。如果要将多个属性加载到同一产品,可以将它们添加到$ configurableAttributesData数组中。

您仍然可以使用在代码中创建的原始$ configurableProductsData,但是由于其大部分用途都转移到了attributes-array,您也可以只创建一个简单的Simple Product ID数组。这就是我用$ configurableProductsIds做的。

希望这也可以帮助你。