【问题标题】:Magento 1.9.X programmatically save custom attributeMagento 1.9.X 以编程方式保存自定义属性
【发布时间】:2016-09-05 12:30:53
【问题描述】:

我制作了一个简单的导入脚本,并尝试以编程方式保存 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']);

所以基本上在调用插入函数后更新内容,使用插入后获得的 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)) 并且它们都是多选属性,所以我理论上可以将多个值传递给它们。

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

【问题讨论】:

    标签: php magento


    【解决方案1】:

    自从我在这里写了 10 分钟后,我终于找到了路。我花了我一辈子来解决它。

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

    我是这样做的:

    在我添加的函数 insert_product 中:

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

    因此,如果您的属性被命名,假设“品牌”它将是:

    $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 函数以更有效的方式一次完成所有操作。这是 kust 一个有效的“基本”版本,请随意让它变得花哨和智能。

    然后我创建了另一个名为 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;
    }
    

    老实说,我在其他来源/作者的拼贴中发现了这一点,所以我需要感谢这里和那里的一群更聪明的程序员,因为我花了一段时间来为这个简单的任务而苦苦挣扎,我写了这里的解决方案希望对你们有所帮助。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      相关资源
      最近更新 更多