簡體   English   中英

Magento 1.9.X以編程方式保存自定義屬性

[英]Magento 1.9.X programmatically save custom attribute

我做了一個簡單的導入腳本,我試圖以編程方式保存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以編程方式導入產品來添加自定義選項 ,我嘗試在insert_product函數內以及$ productID = $ this-> insert_product($ data)之后進行添加; 兩者都不起作用。

最后我嘗試了一個神奇的$ product-> setAtt1('value'); 在insert_product函數中,不確定Magento如何理解以這種方式設置att1,但是...您知道,我在某處閱讀了該書,然后嘗試了;)

att1,att2和att3拼寫為小寫,盡管它們有一個大寫標簽(認為這里無關緊要),它們是屬性組的一部分(我通過$ product-> setAttributeSetId($ this-> setAttributi )),並且它們都是多個選擇屬性,因此我可以在teory中將多個值傳遞給它們。

我確定我在途中丟失了一些東西。 有人可以幫忙嗎?

自從我在這里寫了十分鍾之后,我找到了方法。 我花了我永遠解決。

提示是您必須添加屬性ID,而不是值。 至少對於我來說,具有多個選擇屬性會發生這種情況,不確定是否一直都是如此。

這是我的做法:

在函數insert_product中,我添加了:

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

因此,如果您的yor屬性被命名,那么說“品牌”,它將是:

$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;
}

老實說,我是從其他來源/作者那里找到的,所以我要感謝這里和那里的一群聰明的程序員,因為花了我一段時間來完成這個簡單的任務,所以我在這里寫了解決方案,希望幫助你們 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM