Magento 1.9.X以编程方式保存自定义属性

时间:2016-05-10 13:29:49

标签: php magento

我制作了一个简单的导入脚本,我正在尝试以编程方式保存3个自定义属性(att1,att2,att3)以及所有其他信息(名称,描述,价格,类别......)。

基本上我有:

public function insert_product($data) {

    $product = Mage::getModel('catalog/product');   

    try {

        $sku = $data['code'];

        if ($this->prodottiImportati[$sku]) {

            $sku = $data['code'] . '-1';        
        }
        $this->prodottiImportati[$sku] = true;

        $product->setSku($sku);
        $product->setName($data['name']);
        $product->setDescription($data['desc']);
        $product->setShortDescription($data['short_desc']);
        $product->setManufacturer('');
        $product->setPrice($data['price']);

        $product->setTypeId('simple');
        $product->setAttributeSetId($this->attributeSet);

        $categorie = $this->get_categories($data);
        $product->setCategoryIds($categorie);

        $product->setWeight($data['peso']);

        $product->setTaxClassId(2); // taxable goods
        $product->setVisibility(4); // catalog, search
        $product->setStatus(1); // enabled

        $product->setWebsiteIds($data['store_id']);

        $stockData = $product->getStockData();
        $stockData['qty'] = $data['qty'];
        if ($data['quantita'] > 0) {
            $stockData['is_in_stock'] = 1;  
        } else {
            $stockData['is_in_stock'] = 0;
        }
        $stockData['manage_stock'] = 1;
        $stockData['use_config_manage_stock'] = 0;
        $product->setStockData($stockData);

        $product->setIsMassupdate(true)->setExcludeUrlRewrite(true);                
        $product->save();

        $productID = $product->getId();

    } catch(Exception $e) {

        echo ($e->getMessage());
    }

    return $productID;
}

我尝试的第一件事是添加

$productID = $this->insert_product($data);
Mage::getSingleton('catalog/product_action')->updateAttributes(
            array($productID), array(
               'att1' => $data['att1'],
            ), $data['store_id']);

所以基本上在调用insert函数之后更新东西,使用插入后得到的ID。 store_id是该给定语言中商店的ID。没有保存任何东西。

第二次尝试,我接下来:Magento add custom options with programmatically importing products 我在insert_product函数中尝试了这个,并且在$ productID = $ this-> insert_product($ data)之后也在外面。两者都没有。

最后我尝试了一个神奇的$ product-> setAtt1('value');在insert_product函数中,不知道Magento如何理解如何设置att1那样,但是......你知道,我在某个地方读了它,我试了一下;)

att1,att2和att3拼写为小写,但是它们有一个大写标签(认为这里不重要),它们是属性组的一部分(我用$ product-> setAttributeSetId($)传递它this-> setAttributi))并且它们都是多个选择属性,所以我可以在teory中传递多个值。

我确定我在途中遗漏了一些东西。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

自从我在这里写了10多分钟后,我才找到了方法。我带我永远解决它。

这样做的线索是你必须添加属性ID,而不是值。这至少对我来说有多个选择属性,不确定它是否一直都是真的。

我是这样做的:

在我添加的函数insert_product中:

$optionId = $this->get_option_id_by_code('att1', 'Value of the attribute you need to add'); 
$product->setAtt1($optionId);

因此,如果yor属性被命名,那就说" brand"它将是:

$optionId = $this->get_option_id_by_code('brand', 'Nike'); 
$product->setBrand($optionId);

如果您的属性可以包含多个值,则需要将上面的代码更改为:

$optionId = array();
foreach ($myAttributesArray as $someValues) {

     $optionId[] = $this->get_option_id_by_code('att1', $someValues);
}
$product->setAtt1($optionId);

foreach只是一个例子,您需要遍历多个值并获取相应的ID并将它们全部添加到setAtt1以将它们作为数组传递。我正在开发一个改进的版本,其中get_option_id_by_code函数以更有效的方式同时执行所有操作。这是一个基本的"基本的"有效的版本,随意使它变得花哨和聪明。

然后我创建了另一个名为get_option_id_by_code的函数,如下所示:

protected function get_option_id_by_code($attrCode, $optionLabel) {

    $attrModel   = Mage::getModel('eav/entity_attribute');

    $attrID      = $attrModel->getIdByCode('catalog_product', $attrCode);
    $attribute   = $attrModel->load($attrID);

    $options     = Mage::getModel('eav/entity_attribute_source_table')
        ->setAttribute($attribute)
        ->getAllOptions(false);

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

    return false;
}

说实话,我发现这是一个其他来源/作者的拼贴画,所以我需要感谢一群聪明的程序员,因为我花了一段时间来完成这个简单的任务,我写了这里的解决方案希望能帮到你们。谢谢!